diff --git a/test/tint/builtins/gen/abs/002533.wgsl b/test/tint/builtins/gen/abs/002533.wgsl
deleted file mode 100644
index 0ec9722..0000000
--- a/test/tint/builtins/gen/abs/002533.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<4, f32>) -> vec<4, f32>
-fn abs_002533() {
-  var res: vec4<f32> = abs(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_002533();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_002533();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_002533();
-}
diff --git a/test/tint/builtins/gen/abs/005174.wgsl b/test/tint/builtins/gen/abs/005174.wgsl
deleted file mode 100644
index 1dff647..0000000
--- a/test/tint/builtins/gen/abs/005174.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<3, f32>) -> vec<3, f32>
-fn abs_005174() {
-  var res: vec3<f32> = abs(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_005174();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_005174();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_005174();
-}
diff --git a/test/tint/builtins/gen/abs/1ce782.wgsl b/test/tint/builtins/gen/abs/1ce782.wgsl
deleted file mode 100644
index 9625dec..0000000
--- a/test/tint/builtins/gen/abs/1ce782.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<4, u32>) -> vec<4, u32>
-fn abs_1ce782() {
-  var res: vec4<u32> = abs(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_1ce782();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_1ce782();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_1ce782();
-}
diff --git a/test/tint/builtins/gen/abs/1e9d53.wgsl b/test/tint/builtins/gen/abs/1e9d53.wgsl
deleted file mode 100644
index 9ad99cd..0000000
--- a/test/tint/builtins/gen/abs/1e9d53.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<2, f32>) -> vec<2, f32>
-fn abs_1e9d53() {
-  var res: vec2<f32> = abs(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_1e9d53();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_1e9d53();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_1e9d53();
-}
diff --git a/test/tint/builtins/gen/abs/467cd1.wgsl b/test/tint/builtins/gen/abs/467cd1.wgsl
deleted file mode 100644
index 888fbb1..0000000
--- a/test/tint/builtins/gen/abs/467cd1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(u32) -> u32
-fn abs_467cd1() {
-  var res: u32 = abs(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_467cd1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_467cd1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_467cd1();
-}
diff --git a/test/tint/builtins/gen/abs/4ad288.wgsl b/test/tint/builtins/gen/abs/4ad288.wgsl
deleted file mode 100644
index 62af62a..0000000
--- a/test/tint/builtins/gen/abs/4ad288.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(i32) -> i32
-fn abs_4ad288() {
-  var res: i32 = abs(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_4ad288();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_4ad288();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_4ad288();
-}
diff --git a/test/tint/builtins/gen/abs/5ad50a.wgsl b/test/tint/builtins/gen/abs/5ad50a.wgsl
deleted file mode 100644
index 5344a49..0000000
--- a/test/tint/builtins/gen/abs/5ad50a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<3, i32>) -> vec<3, i32>
-fn abs_5ad50a() {
-  var res: vec3<i32> = abs(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_5ad50a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_5ad50a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_5ad50a();
-}
diff --git a/test/tint/builtins/gen/abs/7326de.wgsl b/test/tint/builtins/gen/abs/7326de.wgsl
deleted file mode 100644
index 860ec8a..0000000
--- a/test/tint/builtins/gen/abs/7326de.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<3, u32>) -> vec<3, u32>
-fn abs_7326de() {
-  var res: vec3<u32> = abs(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_7326de();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_7326de();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_7326de();
-}
diff --git a/test/tint/builtins/gen/abs/7f28e6.wgsl b/test/tint/builtins/gen/abs/7f28e6.wgsl
deleted file mode 100644
index af3bf44..0000000
--- a/test/tint/builtins/gen/abs/7f28e6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<2, u32>) -> vec<2, u32>
-fn abs_7f28e6() {
-  var res: vec2<u32> = abs(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_7f28e6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_7f28e6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_7f28e6();
-}
diff --git a/test/tint/builtins/gen/abs/7faa9e.wgsl b/test/tint/builtins/gen/abs/7faa9e.wgsl
deleted file mode 100644
index b88f802..0000000
--- a/test/tint/builtins/gen/abs/7faa9e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<2, i32>) -> vec<2, i32>
-fn abs_7faa9e() {
-  var res: vec2<i32> = abs(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_7faa9e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_7faa9e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_7faa9e();
-}
diff --git a/test/tint/builtins/gen/abs/9c80a6.wgsl b/test/tint/builtins/gen/abs/9c80a6.wgsl
deleted file mode 100644
index 7a66ed0..0000000
--- a/test/tint/builtins/gen/abs/9c80a6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(vec<4, i32>) -> vec<4, i32>
-fn abs_9c80a6() {
-  var res: vec4<i32> = abs(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_9c80a6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_9c80a6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_9c80a6();
-}
diff --git a/test/tint/builtins/gen/abs/b96037.wgsl b/test/tint/builtins/gen/abs/b96037.wgsl
deleted file mode 100644
index 36b06a4..0000000
--- a/test/tint/builtins/gen/abs/b96037.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn abs(f32) -> f32
-fn abs_b96037() {
-  var res: f32 = abs(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  abs_b96037();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  abs_b96037();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  abs_b96037();
-}
diff --git a/test/tint/builtins/gen/acos/489247.wgsl b/test/tint/builtins/gen/acos/489247.wgsl
deleted file mode 100644
index d43d044..0000000
--- a/test/tint/builtins/gen/acos/489247.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn acos(f32) -> f32
-fn acos_489247() {
-  var res: f32 = acos(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  acos_489247();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  acos_489247();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  acos_489247();
-}
diff --git a/test/tint/builtins/gen/acos/8e2acf.wgsl b/test/tint/builtins/gen/acos/8e2acf.wgsl
deleted file mode 100644
index d4f40c6..0000000
--- a/test/tint/builtins/gen/acos/8e2acf.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn acos(vec<4, f32>) -> vec<4, f32>
-fn acos_8e2acf() {
-  var res: vec4<f32> = acos(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  acos_8e2acf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  acos_8e2acf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  acos_8e2acf();
-}
diff --git a/test/tint/builtins/gen/acos/a610c4.wgsl b/test/tint/builtins/gen/acos/a610c4.wgsl
deleted file mode 100644
index 32ec90b..0000000
--- a/test/tint/builtins/gen/acos/a610c4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn acos(vec<3, f32>) -> vec<3, f32>
-fn acos_a610c4() {
-  var res: vec3<f32> = acos(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  acos_a610c4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  acos_a610c4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  acos_a610c4();
-}
diff --git a/test/tint/builtins/gen/acos/dfc915.wgsl b/test/tint/builtins/gen/acos/dfc915.wgsl
deleted file mode 100644
index f1313be..0000000
--- a/test/tint/builtins/gen/acos/dfc915.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn acos(vec<2, f32>) -> vec<2, f32>
-fn acos_dfc915() {
-  var res: vec2<f32> = acos(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  acos_dfc915();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  acos_dfc915();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  acos_dfc915();
-}
diff --git a/test/tint/builtins/gen/all/353d6a.wgsl b/test/tint/builtins/gen/all/353d6a.wgsl
deleted file mode 100644
index 11e9479..0000000
--- a/test/tint/builtins/gen/all/353d6a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn all(bool) -> bool
-fn all_353d6a() {
-  var res: bool = all(bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  all_353d6a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  all_353d6a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  all_353d6a();
-}
diff --git a/test/tint/builtins/gen/all/986c7b.wgsl b/test/tint/builtins/gen/all/986c7b.wgsl
deleted file mode 100644
index 5e3d3c4..0000000
--- a/test/tint/builtins/gen/all/986c7b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn all(vec<4, bool>) -> bool
-fn all_986c7b() {
-  var res: bool = all(vec4<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  all_986c7b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  all_986c7b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  all_986c7b();
-}
diff --git a/test/tint/builtins/gen/all/bd2dba.wgsl b/test/tint/builtins/gen/all/bd2dba.wgsl
deleted file mode 100644
index 7b98f0d..0000000
--- a/test/tint/builtins/gen/all/bd2dba.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn all(vec<3, bool>) -> bool
-fn all_bd2dba() {
-  var res: bool = all(vec3<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  all_bd2dba();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  all_bd2dba();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  all_bd2dba();
-}
diff --git a/test/tint/builtins/gen/all/f46790.wgsl b/test/tint/builtins/gen/all/f46790.wgsl
deleted file mode 100644
index 6e5b3ea..0000000
--- a/test/tint/builtins/gen/all/f46790.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn all(vec<2, bool>) -> bool
-fn all_f46790() {
-  var res: bool = all(vec2<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  all_f46790();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  all_f46790();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  all_f46790();
-}
diff --git a/test/tint/builtins/gen/any/083428.wgsl b/test/tint/builtins/gen/any/083428.wgsl
deleted file mode 100644
index d360268..0000000
--- a/test/tint/builtins/gen/any/083428.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn any(vec<4, bool>) -> bool
-fn any_083428() {
-  var res: bool = any(vec4<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  any_083428();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  any_083428();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  any_083428();
-}
diff --git a/test/tint/builtins/gen/any/0e3e58.wgsl b/test/tint/builtins/gen/any/0e3e58.wgsl
deleted file mode 100644
index a2d13f5..0000000
--- a/test/tint/builtins/gen/any/0e3e58.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn any(vec<2, bool>) -> bool
-fn any_0e3e58() {
-  var res: bool = any(vec2<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  any_0e3e58();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  any_0e3e58();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  any_0e3e58();
-}
diff --git a/test/tint/builtins/gen/any/2ab91a.wgsl b/test/tint/builtins/gen/any/2ab91a.wgsl
deleted file mode 100644
index c02781c..0000000
--- a/test/tint/builtins/gen/any/2ab91a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn any(bool) -> bool
-fn any_2ab91a() {
-  var res: bool = any(bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  any_2ab91a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  any_2ab91a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  any_2ab91a();
-}
diff --git a/test/tint/builtins/gen/any/e755c1.wgsl b/test/tint/builtins/gen/any/e755c1.wgsl
deleted file mode 100644
index 342c9d2..0000000
--- a/test/tint/builtins/gen/any/e755c1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn any(vec<3, bool>) -> bool
-fn any_e755c1() {
-  var res: bool = any(vec3<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  any_e755c1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  any_e755c1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  any_e755c1();
-}
diff --git a/test/tint/builtins/gen/arrayLength/1588cd.wgsl b/test/tint/builtins/gen/arrayLength/1588cd.wgsl
deleted file mode 100644
index 02b63c6..0000000
--- a/test/tint/builtins/gen/arrayLength/1588cd.wgsl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RO {
-  arg_0: array<i32>,
-};
-@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
-
-// fn arrayLength(ptr<storage, array<i32>, read>) -> u32
-fn arrayLength_1588cd() {
-  var res: u32 = arrayLength(&sb_ro.arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  arrayLength_1588cd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  arrayLength_1588cd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  arrayLength_1588cd();
-}
diff --git a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl b/test/tint/builtins/gen/arrayLength/61b1c7.wgsl
deleted file mode 100644
index 195f911..0000000
--- a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: array<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn arrayLength(ptr<storage, array<i32>, read_write>) -> u32
-fn arrayLength_61b1c7() {
-  var res: u32 = arrayLength(&sb_rw.arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  arrayLength_61b1c7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  arrayLength_61b1c7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  arrayLength_61b1c7();
-}
diff --git a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl b/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl
deleted file mode 100644
index a9ae5dc..0000000
--- a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RO {
-  arg_0: array<f32>,
-};
-@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
-
-// fn arrayLength(ptr<storage, array<f32>, read>) -> u32
-fn arrayLength_a0f5ca() {
-  var res: u32 = arrayLength(&sb_ro.arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  arrayLength_a0f5ca();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  arrayLength_a0f5ca();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  arrayLength_a0f5ca();
-}
diff --git a/test/tint/builtins/gen/arrayLength/cdd123.wgsl b/test/tint/builtins/gen/arrayLength/cdd123.wgsl
deleted file mode 100644
index fae8c7f..0000000
--- a/test/tint/builtins/gen/arrayLength/cdd123.wgsl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: array<f32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn arrayLength(ptr<storage, array<f32>, read_write>) -> u32
-fn arrayLength_cdd123() {
-  var res: u32 = arrayLength(&sb_rw.arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  arrayLength_cdd123();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  arrayLength_cdd123();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  arrayLength_cdd123();
-}
diff --git a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl b/test/tint/builtins/gen/arrayLength/cfca0a.wgsl
deleted file mode 100644
index afebc26..0000000
--- a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RO {
-  arg_0: array<u32>,
-};
-@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
-
-// fn arrayLength(ptr<storage, array<u32>, read>) -> u32
-fn arrayLength_cfca0a() {
-  var res: u32 = arrayLength(&sb_ro.arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  arrayLength_cfca0a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  arrayLength_cfca0a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  arrayLength_cfca0a();
-}
diff --git a/test/tint/builtins/gen/arrayLength/eb510f.wgsl b/test/tint/builtins/gen/arrayLength/eb510f.wgsl
deleted file mode 100644
index f9d0163..0000000
--- a/test/tint/builtins/gen/arrayLength/eb510f.wgsl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: array<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn arrayLength(ptr<storage, array<u32>, read_write>) -> u32
-fn arrayLength_eb510f() {
-  var res: u32 = arrayLength(&sb_rw.arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  arrayLength_eb510f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  arrayLength_eb510f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  arrayLength_eb510f();
-}
diff --git a/test/tint/builtins/gen/asin/064953.wgsl b/test/tint/builtins/gen/asin/064953.wgsl
deleted file mode 100644
index e26ebf2..0000000
--- a/test/tint/builtins/gen/asin/064953.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn asin(vec<4, f32>) -> vec<4, f32>
-fn asin_064953() {
-  var res: vec4<f32> = asin(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  asin_064953();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  asin_064953();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  asin_064953();
-}
diff --git a/test/tint/builtins/gen/asin/7b6a44.wgsl b/test/tint/builtins/gen/asin/7b6a44.wgsl
deleted file mode 100644
index 57b4c94..0000000
--- a/test/tint/builtins/gen/asin/7b6a44.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn asin(vec<2, f32>) -> vec<2, f32>
-fn asin_7b6a44() {
-  var res: vec2<f32> = asin(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  asin_7b6a44();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  asin_7b6a44();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  asin_7b6a44();
-}
diff --git a/test/tint/builtins/gen/asin/8cd9c9.wgsl b/test/tint/builtins/gen/asin/8cd9c9.wgsl
deleted file mode 100644
index 5406bd9..0000000
--- a/test/tint/builtins/gen/asin/8cd9c9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn asin(vec<3, f32>) -> vec<3, f32>
-fn asin_8cd9c9() {
-  var res: vec3<f32> = asin(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  asin_8cd9c9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  asin_8cd9c9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  asin_8cd9c9();
-}
diff --git a/test/tint/builtins/gen/asin/c0c272.wgsl b/test/tint/builtins/gen/asin/c0c272.wgsl
deleted file mode 100644
index 339c53f..0000000
--- a/test/tint/builtins/gen/asin/c0c272.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn asin(f32) -> f32
-fn asin_c0c272() {
-  var res: f32 = asin(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  asin_c0c272();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  asin_c0c272();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  asin_c0c272();
-}
diff --git a/test/tint/builtins/gen/atan/02979a.wgsl b/test/tint/builtins/gen/atan/02979a.wgsl
deleted file mode 100644
index 99fc24b..0000000
--- a/test/tint/builtins/gen/atan/02979a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan(f32) -> f32
-fn atan_02979a() {
-  var res: f32 = atan(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan_02979a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan_02979a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan_02979a();
-}
diff --git a/test/tint/builtins/gen/atan/331e6d.wgsl b/test/tint/builtins/gen/atan/331e6d.wgsl
deleted file mode 100644
index e3f4989..0000000
--- a/test/tint/builtins/gen/atan/331e6d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan(vec<3, f32>) -> vec<3, f32>
-fn atan_331e6d() {
-  var res: vec3<f32> = atan(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan_331e6d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan_331e6d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan_331e6d();
-}
diff --git a/test/tint/builtins/gen/atan/a8b696.wgsl b/test/tint/builtins/gen/atan/a8b696.wgsl
deleted file mode 100644
index 2eea842..0000000
--- a/test/tint/builtins/gen/atan/a8b696.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan(vec<4, f32>) -> vec<4, f32>
-fn atan_a8b696() {
-  var res: vec4<f32> = atan(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan_a8b696();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan_a8b696();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan_a8b696();
-}
diff --git a/test/tint/builtins/gen/atan/ad96e4.wgsl b/test/tint/builtins/gen/atan/ad96e4.wgsl
deleted file mode 100644
index 170c7fc..0000000
--- a/test/tint/builtins/gen/atan/ad96e4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan(vec<2, f32>) -> vec<2, f32>
-fn atan_ad96e4() {
-  var res: vec2<f32> = atan(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan_ad96e4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan_ad96e4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan_ad96e4();
-}
diff --git a/test/tint/builtins/gen/atan2/57fb13.wgsl b/test/tint/builtins/gen/atan2/57fb13.wgsl
deleted file mode 100644
index be99214..0000000
--- a/test/tint/builtins/gen/atan2/57fb13.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan2(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn atan2_57fb13() {
-  var res: vec2<f32> = atan2(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan2_57fb13();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan2_57fb13();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan2_57fb13();
-}
diff --git a/test/tint/builtins/gen/atan2/96057c.wgsl b/test/tint/builtins/gen/atan2/96057c.wgsl
deleted file mode 100644
index dad1ef2..0000000
--- a/test/tint/builtins/gen/atan2/96057c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan2(f32, f32) -> f32
-fn atan2_96057c() {
-  var res: f32 = atan2(1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan2_96057c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan2_96057c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan2_96057c();
-}
diff --git a/test/tint/builtins/gen/atan2/a70d0d.wgsl b/test/tint/builtins/gen/atan2/a70d0d.wgsl
deleted file mode 100644
index 26af2e6..0000000
--- a/test/tint/builtins/gen/atan2/a70d0d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan2(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn atan2_a70d0d() {
-  var res: vec3<f32> = atan2(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan2_a70d0d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan2_a70d0d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan2_a70d0d();
-}
diff --git a/test/tint/builtins/gen/atan2/ae713e.wgsl b/test/tint/builtins/gen/atan2/ae713e.wgsl
deleted file mode 100644
index 63a6442..0000000
--- a/test/tint/builtins/gen/atan2/ae713e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn atan2(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn atan2_ae713e() {
-  var res: vec4<f32> = atan2(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  atan2_ae713e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atan2_ae713e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atan2_ae713e();
-}
diff --git a/test/tint/builtins/gen/atomicAdd/794055.wgsl b/test/tint/builtins/gen/atomicAdd/794055.wgsl
deleted file mode 100644
index 6c60c66..0000000
--- a/test/tint/builtins/gen/atomicAdd/794055.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicAdd(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicAdd_794055() {
-  var res: i32 = atomicAdd(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAdd_794055();
-}
diff --git a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl b/test/tint/builtins/gen/atomicAdd/8a199a.wgsl
deleted file mode 100644
index af301b7..0000000
--- a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicAdd(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicAdd_8a199a() {
-  var res: u32 = atomicAdd(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicAdd_8a199a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAdd_8a199a();
-}
diff --git a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl b/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl
deleted file mode 100644
index 23fd6a4..0000000
--- a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicAdd(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicAdd_d32fe4() {
-  var res: i32 = atomicAdd(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicAdd_d32fe4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAdd_d32fe4();
-}
diff --git a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl b/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl
deleted file mode 100644
index ba04b1a..0000000
--- a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicAdd(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicAdd_d5db1d() {
-  var res: u32 = atomicAdd(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAdd_d5db1d();
-}
diff --git a/test/tint/builtins/gen/atomicAnd/152966.wgsl b/test/tint/builtins/gen/atomicAnd/152966.wgsl
deleted file mode 100644
index fa2fee4..0000000
--- a/test/tint/builtins/gen/atomicAnd/152966.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicAnd(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicAnd_152966() {
-  var res: i32 = atomicAnd(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicAnd_152966();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAnd_152966();
-}
diff --git a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl b/test/tint/builtins/gen/atomicAnd/34edd3.wgsl
deleted file mode 100644
index 18f2a0c..0000000
--- a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicAnd(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicAnd_34edd3() {
-  var res: u32 = atomicAnd(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAnd_34edd3();
-}
diff --git a/test/tint/builtins/gen/atomicAnd/45a819.wgsl b/test/tint/builtins/gen/atomicAnd/45a819.wgsl
deleted file mode 100644
index 2eedbaf..0000000
--- a/test/tint/builtins/gen/atomicAnd/45a819.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicAnd(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicAnd_45a819() {
-  var res: i32 = atomicAnd(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAnd_45a819();
-}
diff --git a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl b/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl
deleted file mode 100644
index b4027bd..0000000
--- a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicAnd(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicAnd_85a8d9() {
-  var res: u32 = atomicAnd(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicAnd_85a8d9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicAnd_85a8d9();
-}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl b/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl
deleted file mode 100644
index f3c62f7..0000000
--- a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicCompareExchangeWeak(ptr<storage, atomic<i32>, read_write>, i32, i32) -> __atomic_compare_exchange_result<i32>
-fn atomicCompareExchangeWeak_1bd40a() {
-  var res = atomicCompareExchangeWeak(&sb_rw.arg_0, 1, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicCompareExchangeWeak_1bd40a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicCompareExchangeWeak_1bd40a();
-}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl b/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl
deleted file mode 100644
index 2fde0d8..0000000
--- a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicCompareExchangeWeak(ptr<storage, atomic<u32>, read_write>, u32, u32) -> __atomic_compare_exchange_result<u32>
-fn atomicCompareExchangeWeak_63d8e6() {
-  var res = atomicCompareExchangeWeak(&sb_rw.arg_0, 1u, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicCompareExchangeWeak_63d8e6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicCompareExchangeWeak_63d8e6();
-}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl b/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl
deleted file mode 100644
index 599f9be..0000000
--- a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicCompareExchangeWeak(ptr<workgroup, atomic<u32>, read_write>, u32, u32) -> __atomic_compare_exchange_result<u32>
-fn atomicCompareExchangeWeak_83580d() {
-  var res = atomicCompareExchangeWeak(&arg_0, 1u, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicCompareExchangeWeak_83580d();
-}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl b/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl
deleted file mode 100644
index 2147f98..0000000
--- a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicCompareExchangeWeak(ptr<workgroup, atomic<i32>, read_write>, i32, i32) -> __atomic_compare_exchange_result<i32>
-fn atomicCompareExchangeWeak_e88938() {
-  var res = atomicCompareExchangeWeak(&arg_0, 1, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicCompareExchangeWeak_e88938();
-}
diff --git a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl b/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl
deleted file mode 100644
index 092c5ac..0000000
--- a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicExchange(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicExchange_0a5dca() {
-  var res: u32 = atomicExchange(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicExchange_0a5dca();
-}
diff --git a/test/tint/builtins/gen/atomicExchange/d59712.wgsl b/test/tint/builtins/gen/atomicExchange/d59712.wgsl
deleted file mode 100644
index 2aa8b8b..0000000
--- a/test/tint/builtins/gen/atomicExchange/d59712.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicExchange(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicExchange_d59712() {
-  var res: u32 = atomicExchange(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicExchange_d59712();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicExchange_d59712();
-}
diff --git a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl b/test/tint/builtins/gen/atomicExchange/e114ba.wgsl
deleted file mode 100644
index 3fc0b8f..0000000
--- a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicExchange(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicExchange_e114ba() {
-  var res: i32 = atomicExchange(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicExchange_e114ba();
-}
diff --git a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl b/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl
deleted file mode 100644
index 566f563..0000000
--- a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicExchange(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicExchange_f2e22f() {
-  var res: i32 = atomicExchange(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicExchange_f2e22f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicExchange_f2e22f();
-}
diff --git a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl b/test/tint/builtins/gen/atomicLoad/0806ad.wgsl
deleted file mode 100644
index 9fc9f60..0000000
--- a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicLoad(ptr<storage, atomic<i32>, read_write>) -> i32
-fn atomicLoad_0806ad() {
-  var res: i32 = atomicLoad(&sb_rw.arg_0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicLoad_0806ad();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicLoad_0806ad();
-}
diff --git a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl b/test/tint/builtins/gen/atomicLoad/361bf1.wgsl
deleted file mode 100644
index 99e9c04..0000000
--- a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicLoad(ptr<workgroup, atomic<u32>, read_write>) -> u32
-fn atomicLoad_361bf1() {
-  var res: u32 = atomicLoad(&arg_0);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicLoad_361bf1();
-}
diff --git a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl b/test/tint/builtins/gen/atomicLoad/afcc03.wgsl
deleted file mode 100644
index 935ab5f..0000000
--- a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicLoad(ptr<workgroup, atomic<i32>, read_write>) -> i32
-fn atomicLoad_afcc03() {
-  var res: i32 = atomicLoad(&arg_0);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicLoad_afcc03();
-}
diff --git a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl b/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl
deleted file mode 100644
index e1e256a..0000000
--- a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicLoad(ptr<storage, atomic<u32>, read_write>) -> u32
-fn atomicLoad_fe6cc3() {
-  var res: u32 = atomicLoad(&sb_rw.arg_0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicLoad_fe6cc3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicLoad_fe6cc3();
-}
diff --git a/test/tint/builtins/gen/atomicMax/51b9be.wgsl b/test/tint/builtins/gen/atomicMax/51b9be.wgsl
deleted file mode 100644
index 43a6f6c..0000000
--- a/test/tint/builtins/gen/atomicMax/51b9be.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicMax(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicMax_51b9be() {
-  var res: u32 = atomicMax(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicMax_51b9be();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMax_51b9be();
-}
diff --git a/test/tint/builtins/gen/atomicMax/92aa72.wgsl b/test/tint/builtins/gen/atomicMax/92aa72.wgsl
deleted file mode 100644
index 7336d64..0000000
--- a/test/tint/builtins/gen/atomicMax/92aa72.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicMax(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicMax_92aa72() {
-  var res: i32 = atomicMax(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicMax_92aa72();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMax_92aa72();
-}
diff --git a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl b/test/tint/builtins/gen/atomicMax/a89cc3.wgsl
deleted file mode 100644
index beea1a7..0000000
--- a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicMax(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicMax_a89cc3() {
-  var res: i32 = atomicMax(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMax_a89cc3();
-}
diff --git a/test/tint/builtins/gen/atomicMax/beccfc.wgsl b/test/tint/builtins/gen/atomicMax/beccfc.wgsl
deleted file mode 100644
index 452b307..0000000
--- a/test/tint/builtins/gen/atomicMax/beccfc.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicMax(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicMax_beccfc() {
-  var res: u32 = atomicMax(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMax_beccfc();
-}
diff --git a/test/tint/builtins/gen/atomicMin/278235.wgsl b/test/tint/builtins/gen/atomicMin/278235.wgsl
deleted file mode 100644
index ff8a7cf..0000000
--- a/test/tint/builtins/gen/atomicMin/278235.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicMin(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicMin_278235() {
-  var res: i32 = atomicMin(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMin_278235();
-}
diff --git a/test/tint/builtins/gen/atomicMin/69d383.wgsl b/test/tint/builtins/gen/atomicMin/69d383.wgsl
deleted file mode 100644
index f4f70b1..0000000
--- a/test/tint/builtins/gen/atomicMin/69d383.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicMin(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicMin_69d383() {
-  var res: u32 = atomicMin(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMin_69d383();
-}
diff --git a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl b/test/tint/builtins/gen/atomicMin/8e38dc.wgsl
deleted file mode 100644
index 484f709..0000000
--- a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicMin(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicMin_8e38dc() {
-  var res: i32 = atomicMin(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicMin_8e38dc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMin_8e38dc();
-}
diff --git a/test/tint/builtins/gen/atomicMin/c67a74.wgsl b/test/tint/builtins/gen/atomicMin/c67a74.wgsl
deleted file mode 100644
index cf8986b..0000000
--- a/test/tint/builtins/gen/atomicMin/c67a74.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicMin(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicMin_c67a74() {
-  var res: u32 = atomicMin(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicMin_c67a74();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicMin_c67a74();
-}
diff --git a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl b/test/tint/builtins/gen/atomicOr/5e3d61.wgsl
deleted file mode 100644
index 9520869..0000000
--- a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicOr(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicOr_5e3d61() {
-  var res: u32 = atomicOr(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicOr_5e3d61();
-}
diff --git a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl b/test/tint/builtins/gen/atomicOr/5e95d4.wgsl
deleted file mode 100644
index d35f502..0000000
--- a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicOr(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicOr_5e95d4() {
-  var res: u32 = atomicOr(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicOr_5e95d4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicOr_5e95d4();
-}
diff --git a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl b/test/tint/builtins/gen/atomicOr/8d96a0.wgsl
deleted file mode 100644
index 901470f..0000000
--- a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicOr(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicOr_8d96a0() {
-  var res: i32 = atomicOr(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicOr_8d96a0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicOr_8d96a0();
-}
diff --git a/test/tint/builtins/gen/atomicOr/d09248.wgsl b/test/tint/builtins/gen/atomicOr/d09248.wgsl
deleted file mode 100644
index da2bd79..0000000
--- a/test/tint/builtins/gen/atomicOr/d09248.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicOr(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicOr_d09248() {
-  var res: i32 = atomicOr(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicOr_d09248();
-}
diff --git a/test/tint/builtins/gen/atomicStore/726882.wgsl b/test/tint/builtins/gen/atomicStore/726882.wgsl
deleted file mode 100644
index 4ee9d6f..0000000
--- a/test/tint/builtins/gen/atomicStore/726882.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicStore(ptr<workgroup, atomic<u32>, read_write>, u32)
-fn atomicStore_726882() {
-  atomicStore(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicStore_726882();
-}
diff --git a/test/tint/builtins/gen/atomicStore/8bea94.wgsl b/test/tint/builtins/gen/atomicStore/8bea94.wgsl
deleted file mode 100644
index c22ea05..0000000
--- a/test/tint/builtins/gen/atomicStore/8bea94.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicStore(ptr<workgroup, atomic<i32>, read_write>, i32)
-fn atomicStore_8bea94() {
-  atomicStore(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicStore_8bea94();
-}
diff --git a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl b/test/tint/builtins/gen/atomicStore/cdc29e.wgsl
deleted file mode 100644
index ef3c49c..0000000
--- a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicStore(ptr<storage, atomic<u32>, read_write>, u32)
-fn atomicStore_cdc29e() {
-  atomicStore(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicStore_cdc29e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicStore_cdc29e();
-}
diff --git a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl b/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl
deleted file mode 100644
index ea7559d..0000000
--- a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicStore(ptr<storage, atomic<i32>, read_write>, i32)
-fn atomicStore_d1e9a6() {
-  atomicStore(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicStore_d1e9a6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicStore_d1e9a6();
-}
diff --git a/test/tint/builtins/gen/atomicSub/051100.wgsl b/test/tint/builtins/gen/atomicSub/051100.wgsl
deleted file mode 100644
index 6b84ec1..0000000
--- a/test/tint/builtins/gen/atomicSub/051100.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicSub(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicSub_051100() {
-  var res: i32 = atomicSub(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicSub_051100();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicSub_051100();
-}
diff --git a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl b/test/tint/builtins/gen/atomicSub/0d26c2.wgsl
deleted file mode 100644
index 9617c0a..0000000
--- a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicSub(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicSub_0d26c2() {
-  var res: u32 = atomicSub(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicSub_0d26c2();
-}
diff --git a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl b/test/tint/builtins/gen/atomicSub/15bfc9.wgsl
deleted file mode 100644
index c7f190a..0000000
--- a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicSub(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicSub_15bfc9() {
-  var res: u32 = atomicSub(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicSub_15bfc9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicSub_15bfc9();
-}
diff --git a/test/tint/builtins/gen/atomicSub/77883a.wgsl b/test/tint/builtins/gen/atomicSub/77883a.wgsl
deleted file mode 100644
index fbd20fc..0000000
--- a/test/tint/builtins/gen/atomicSub/77883a.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicSub(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicSub_77883a() {
-  var res: i32 = atomicSub(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicSub_77883a();
-}
diff --git a/test/tint/builtins/gen/atomicXor/54510e.wgsl b/test/tint/builtins/gen/atomicXor/54510e.wgsl
deleted file mode 100644
index 86e9648..0000000
--- a/test/tint/builtins/gen/atomicXor/54510e.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<u32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicXor(ptr<storage, atomic<u32>, read_write>, u32) -> u32
-fn atomicXor_54510e() {
-  var res: u32 = atomicXor(&sb_rw.arg_0, 1u);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicXor_54510e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicXor_54510e();
-}
diff --git a/test/tint/builtins/gen/atomicXor/75dc95.wgsl b/test/tint/builtins/gen/atomicXor/75dc95.wgsl
deleted file mode 100644
index 3676e85..0000000
--- a/test/tint/builtins/gen/atomicXor/75dc95.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<i32>;
-
-// fn atomicXor(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
-fn atomicXor_75dc95() {
-  var res: i32 = atomicXor(&arg_0, 1);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicXor_75dc95();
-}
diff --git a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl b/test/tint/builtins/gen/atomicXor/c1b78c.wgsl
deleted file mode 100644
index 9842ed4..0000000
--- a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-struct SB_RW {
-  arg_0: atomic<i32>,
-};
-@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
-
-// fn atomicXor(ptr<storage, atomic<i32>, read_write>, i32) -> i32
-fn atomicXor_c1b78c() {
-  var res: i32 = atomicXor(&sb_rw.arg_0, 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  atomicXor_c1b78c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicXor_c1b78c();
-}
diff --git a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl b/test/tint/builtins/gen/atomicXor/c8e6be.wgsl
deleted file mode 100644
index 3307d26..0000000
--- a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-var<workgroup> arg_0: atomic<u32>;
-
-// fn atomicXor(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
-fn atomicXor_c8e6be() {
-  var res: u32 = atomicXor(&arg_0, 1u);
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  atomicXor_c8e6be();
-}
diff --git a/test/tint/builtins/gen/ceil/34064b.wgsl b/test/tint/builtins/gen/ceil/34064b.wgsl
deleted file mode 100644
index 1445063..0000000
--- a/test/tint/builtins/gen/ceil/34064b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ceil(vec<3, f32>) -> vec<3, f32>
-fn ceil_34064b() {
-  var res: vec3<f32> = ceil(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ceil_34064b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ceil_34064b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ceil_34064b();
-}
diff --git a/test/tint/builtins/gen/ceil/678655.wgsl b/test/tint/builtins/gen/ceil/678655.wgsl
deleted file mode 100644
index d749c91..0000000
--- a/test/tint/builtins/gen/ceil/678655.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ceil(f32) -> f32
-fn ceil_678655() {
-  var res: f32 = ceil(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ceil_678655();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ceil_678655();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ceil_678655();
-}
diff --git a/test/tint/builtins/gen/ceil/96f597.wgsl b/test/tint/builtins/gen/ceil/96f597.wgsl
deleted file mode 100644
index 9d9a2f0..0000000
--- a/test/tint/builtins/gen/ceil/96f597.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ceil(vec<2, f32>) -> vec<2, f32>
-fn ceil_96f597() {
-  var res: vec2<f32> = ceil(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ceil_96f597();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ceil_96f597();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ceil_96f597();
-}
diff --git a/test/tint/builtins/gen/ceil/b74c16.wgsl b/test/tint/builtins/gen/ceil/b74c16.wgsl
deleted file mode 100644
index ea41b22..0000000
--- a/test/tint/builtins/gen/ceil/b74c16.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ceil(vec<4, f32>) -> vec<4, f32>
-fn ceil_b74c16() {
-  var res: vec4<f32> = ceil(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ceil_b74c16();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ceil_b74c16();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ceil_b74c16();
-}
diff --git a/test/tint/builtins/gen/clamp/0acf8f.wgsl b/test/tint/builtins/gen/clamp/0acf8f.wgsl
deleted file mode 100644
index 0650d84..0000000
--- a/test/tint/builtins/gen/clamp/0acf8f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn clamp_0acf8f() {
-  var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_0acf8f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_0acf8f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_0acf8f();
-}
diff --git a/test/tint/builtins/gen/clamp/1a32e3.wgsl b/test/tint/builtins/gen/clamp/1a32e3.wgsl
deleted file mode 100644
index 491e906..0000000
--- a/test/tint/builtins/gen/clamp/1a32e3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<4, i32>, vec<4, i32>, vec<4, i32>) -> vec<4, i32>
-fn clamp_1a32e3() {
-  var res: vec4<i32> = clamp(vec4<i32>(), vec4<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_1a32e3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_1a32e3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_1a32e3();
-}
diff --git a/test/tint/builtins/gen/clamp/2bd567.wgsl b/test/tint/builtins/gen/clamp/2bd567.wgsl
deleted file mode 100644
index 51804e2..0000000
--- a/test/tint/builtins/gen/clamp/2bd567.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(f32, f32, f32) -> f32
-fn clamp_2bd567() {
-  var res: f32 = clamp(1.0, 1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_2bd567();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_2bd567();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_2bd567();
-}
diff --git a/test/tint/builtins/gen/clamp/2bde41.wgsl b/test/tint/builtins/gen/clamp/2bde41.wgsl
deleted file mode 100644
index 9c7f458..0000000
--- a/test/tint/builtins/gen/clamp/2bde41.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn clamp_2bde41() {
-  var res: vec4<f32> = clamp(vec4<f32>(), vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_2bde41();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_2bde41();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_2bde41();
-}
diff --git a/test/tint/builtins/gen/clamp/548fc7.wgsl b/test/tint/builtins/gen/clamp/548fc7.wgsl
deleted file mode 100644
index 7465eaa..0000000
--- a/test/tint/builtins/gen/clamp/548fc7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<3, u32>, vec<3, u32>, vec<3, u32>) -> vec<3, u32>
-fn clamp_548fc7() {
-  var res: vec3<u32> = clamp(vec3<u32>(), vec3<u32>(), vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_548fc7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_548fc7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_548fc7();
-}
diff --git a/test/tint/builtins/gen/clamp/5f0819.wgsl b/test/tint/builtins/gen/clamp/5f0819.wgsl
deleted file mode 100644
index 09a03f7..0000000
--- a/test/tint/builtins/gen/clamp/5f0819.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<3, i32>, vec<3, i32>, vec<3, i32>) -> vec<3, i32>
-fn clamp_5f0819() {
-  var res: vec3<i32> = clamp(vec3<i32>(), vec3<i32>(), vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_5f0819();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_5f0819();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_5f0819();
-}
diff --git a/test/tint/builtins/gen/clamp/6c1749.wgsl b/test/tint/builtins/gen/clamp/6c1749.wgsl
deleted file mode 100644
index 71a22c7..0000000
--- a/test/tint/builtins/gen/clamp/6c1749.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<2, i32>, vec<2, i32>, vec<2, i32>) -> vec<2, i32>
-fn clamp_6c1749() {
-  var res: vec2<i32> = clamp(vec2<i32>(), vec2<i32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_6c1749();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_6c1749();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_6c1749();
-}
diff --git a/test/tint/builtins/gen/clamp/7706d7.wgsl b/test/tint/builtins/gen/clamp/7706d7.wgsl
deleted file mode 100644
index 04c333b..0000000
--- a/test/tint/builtins/gen/clamp/7706d7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<2, u32>, vec<2, u32>, vec<2, u32>) -> vec<2, u32>
-fn clamp_7706d7() {
-  var res: vec2<u32> = clamp(vec2<u32>(), vec2<u32>(), vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_7706d7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_7706d7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_7706d7();
-}
diff --git a/test/tint/builtins/gen/clamp/867397.wgsl b/test/tint/builtins/gen/clamp/867397.wgsl
deleted file mode 100644
index 328951d..0000000
--- a/test/tint/builtins/gen/clamp/867397.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn clamp_867397() {
-  var res: vec3<f32> = clamp(vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_867397();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_867397();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_867397();
-}
diff --git a/test/tint/builtins/gen/clamp/a2de25.wgsl b/test/tint/builtins/gen/clamp/a2de25.wgsl
deleted file mode 100644
index ffec765..0000000
--- a/test/tint/builtins/gen/clamp/a2de25.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(u32, u32, u32) -> u32
-fn clamp_a2de25() {
-  var res: u32 = clamp(1u, 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_a2de25();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_a2de25();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_a2de25();
-}
diff --git a/test/tint/builtins/gen/clamp/b07c65.wgsl b/test/tint/builtins/gen/clamp/b07c65.wgsl
deleted file mode 100644
index 057b56e..0000000
--- a/test/tint/builtins/gen/clamp/b07c65.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(i32, i32, i32) -> i32
-fn clamp_b07c65() {
-  var res: i32 = clamp(1, 1, 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_b07c65();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_b07c65();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_b07c65();
-}
diff --git a/test/tint/builtins/gen/clamp/bd43ce.wgsl b/test/tint/builtins/gen/clamp/bd43ce.wgsl
deleted file mode 100644
index bf1e316..0000000
--- a/test/tint/builtins/gen/clamp/bd43ce.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn clamp(vec<4, u32>, vec<4, u32>, vec<4, u32>) -> vec<4, u32>
-fn clamp_bd43ce() {
-  var res: vec4<u32> = clamp(vec4<u32>(), vec4<u32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  clamp_bd43ce();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  clamp_bd43ce();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  clamp_bd43ce();
-}
diff --git a/test/tint/builtins/gen/cos/16dc15.wgsl b/test/tint/builtins/gen/cos/16dc15.wgsl
deleted file mode 100644
index 021e5c4..0000000
--- a/test/tint/builtins/gen/cos/16dc15.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cos(vec<3, f32>) -> vec<3, f32>
-fn cos_16dc15() {
-  var res: vec3<f32> = cos(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cos_16dc15();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cos_16dc15();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cos_16dc15();
-}
diff --git a/test/tint/builtins/gen/cos/29d66d.wgsl b/test/tint/builtins/gen/cos/29d66d.wgsl
deleted file mode 100644
index 0c13e97..0000000
--- a/test/tint/builtins/gen/cos/29d66d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cos(vec<4, f32>) -> vec<4, f32>
-fn cos_29d66d() {
-  var res: vec4<f32> = cos(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cos_29d66d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cos_29d66d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cos_29d66d();
-}
diff --git a/test/tint/builtins/gen/cos/c3b486.wgsl b/test/tint/builtins/gen/cos/c3b486.wgsl
deleted file mode 100644
index 47e9686..0000000
--- a/test/tint/builtins/gen/cos/c3b486.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cos(vec<2, f32>) -> vec<2, f32>
-fn cos_c3b486() {
-  var res: vec2<f32> = cos(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cos_c3b486();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cos_c3b486();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cos_c3b486();
-}
diff --git a/test/tint/builtins/gen/cos/c5c28e.wgsl b/test/tint/builtins/gen/cos/c5c28e.wgsl
deleted file mode 100644
index a23fe4d..0000000
--- a/test/tint/builtins/gen/cos/c5c28e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cos(f32) -> f32
-fn cos_c5c28e() {
-  var res: f32 = cos(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cos_c5c28e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cos_c5c28e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cos_c5c28e();
-}
diff --git a/test/tint/builtins/gen/cosh/377652.wgsl b/test/tint/builtins/gen/cosh/377652.wgsl
deleted file mode 100644
index 0ad3390..0000000
--- a/test/tint/builtins/gen/cosh/377652.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cosh(vec<3, f32>) -> vec<3, f32>
-fn cosh_377652() {
-  var res: vec3<f32> = cosh(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cosh_377652();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cosh_377652();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cosh_377652();
-}
diff --git a/test/tint/builtins/gen/cosh/c13756.wgsl b/test/tint/builtins/gen/cosh/c13756.wgsl
deleted file mode 100644
index 4f3a5f3..0000000
--- a/test/tint/builtins/gen/cosh/c13756.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cosh(vec<2, f32>) -> vec<2, f32>
-fn cosh_c13756() {
-  var res: vec2<f32> = cosh(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cosh_c13756();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cosh_c13756();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cosh_c13756();
-}
diff --git a/test/tint/builtins/gen/cosh/da92dd.wgsl b/test/tint/builtins/gen/cosh/da92dd.wgsl
deleted file mode 100644
index a109d8d..0000000
--- a/test/tint/builtins/gen/cosh/da92dd.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cosh(f32) -> f32
-fn cosh_da92dd() {
-  var res: f32 = cosh(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cosh_da92dd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cosh_da92dd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cosh_da92dd();
-}
diff --git a/test/tint/builtins/gen/cosh/e0c1de.wgsl b/test/tint/builtins/gen/cosh/e0c1de.wgsl
deleted file mode 100644
index 36fd554..0000000
--- a/test/tint/builtins/gen/cosh/e0c1de.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cosh(vec<4, f32>) -> vec<4, f32>
-fn cosh_e0c1de() {
-  var res: vec4<f32> = cosh(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cosh_e0c1de();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cosh_e0c1de();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cosh_e0c1de();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl b/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl
deleted file mode 100644
index fe5e75b..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(u32) -> u32
-fn countLeadingZeros_208d46() {
-  var res: u32 = countLeadingZeros(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_208d46();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_208d46();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_208d46();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl b/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl
deleted file mode 100644
index 7eb079d..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(i32) -> i32
-fn countLeadingZeros_6d4656() {
-  var res: i32 = countLeadingZeros(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_6d4656();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_6d4656();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_6d4656();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl b/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl
deleted file mode 100644
index 548e9eb..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(vec<2, u32>) -> vec<2, u32>
-fn countLeadingZeros_70783f() {
-  var res: vec2<u32> = countLeadingZeros(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_70783f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_70783f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_70783f();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl b/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl
deleted file mode 100644
index 3b78cb8..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(vec<3, i32>) -> vec<3, i32>
-fn countLeadingZeros_7c38a6() {
-  var res: vec3<i32> = countLeadingZeros(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_7c38a6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_7c38a6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_7c38a6();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl b/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl
deleted file mode 100644
index 572c079..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(vec<2, i32>) -> vec<2, i32>
-fn countLeadingZeros_858d40() {
-  var res: vec2<i32> = countLeadingZeros(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_858d40();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_858d40();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_858d40();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl b/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl
deleted file mode 100644
index e5563bd..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(vec<3, u32>) -> vec<3, u32>
-fn countLeadingZeros_ab6345() {
-  var res: vec3<u32> = countLeadingZeros(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_ab6345();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_ab6345();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_ab6345();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl b/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl
deleted file mode 100644
index 63d3fb1..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(vec<4, i32>) -> vec<4, i32>
-fn countLeadingZeros_eab32b() {
-  var res: vec4<i32> = countLeadingZeros(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_eab32b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_eab32b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_eab32b();
-}
diff --git a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl b/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl
deleted file mode 100644
index 223906e..0000000
--- a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countLeadingZeros(vec<4, u32>) -> vec<4, u32>
-fn countLeadingZeros_f70103() {
-  var res: vec4<u32> = countLeadingZeros(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countLeadingZeros_f70103();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countLeadingZeros_f70103();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countLeadingZeros_f70103();
-}
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl b/test/tint/builtins/gen/countOneBits/0d0e46.wgsl
deleted file mode 100644
index 611d80f..0000000
--- a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(vec<4, u32>) -> vec<4, u32>
-fn countOneBits_0d0e46() {
-  var res: vec4<u32> = countOneBits(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_0d0e46();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_0d0e46();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_0d0e46();
-}
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl b/test/tint/builtins/gen/countOneBits/0f7980.wgsl
deleted file mode 100644
index 3073ef7..0000000
--- a/test/tint/builtins/gen/countOneBits/0f7980.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(vec<4, i32>) -> vec<4, i32>
-fn countOneBits_0f7980() {
-  var res: vec4<i32> = countOneBits(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_0f7980();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_0f7980();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_0f7980();
-}
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl b/test/tint/builtins/gen/countOneBits/65d2ae.wgsl
deleted file mode 100644
index 1a5a546..0000000
--- a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(vec<3, i32>) -> vec<3, i32>
-fn countOneBits_65d2ae() {
-  var res: vec3<i32> = countOneBits(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_65d2ae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_65d2ae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_65d2ae();
-}
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl b/test/tint/builtins/gen/countOneBits/690cfc.wgsl
deleted file mode 100644
index b867e47..0000000
--- a/test/tint/builtins/gen/countOneBits/690cfc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(vec<3, u32>) -> vec<3, u32>
-fn countOneBits_690cfc() {
-  var res: vec3<u32> = countOneBits(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_690cfc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_690cfc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_690cfc();
-}
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl b/test/tint/builtins/gen/countOneBits/94fd81.wgsl
deleted file mode 100644
index e47075b..0000000
--- a/test/tint/builtins/gen/countOneBits/94fd81.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(vec<2, u32>) -> vec<2, u32>
-fn countOneBits_94fd81() {
-  var res: vec2<u32> = countOneBits(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_94fd81();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_94fd81();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_94fd81();
-}
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl b/test/tint/builtins/gen/countOneBits/ae44f9.wgsl
deleted file mode 100644
index 72fcca7..0000000
--- a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(u32) -> u32
-fn countOneBits_ae44f9() {
-  var res: u32 = countOneBits(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_ae44f9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_ae44f9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_ae44f9();
-}
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl b/test/tint/builtins/gen/countOneBits/af90e2.wgsl
deleted file mode 100644
index 29c605d..0000000
--- a/test/tint/builtins/gen/countOneBits/af90e2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(vec<2, i32>) -> vec<2, i32>
-fn countOneBits_af90e2() {
-  var res: vec2<i32> = countOneBits(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_af90e2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_af90e2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_af90e2();
-}
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl b/test/tint/builtins/gen/countOneBits/fd88b2.wgsl
deleted file mode 100644
index 9e27859..0000000
--- a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countOneBits(i32) -> i32
-fn countOneBits_fd88b2() {
-  var res: i32 = countOneBits(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countOneBits_fd88b2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countOneBits_fd88b2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countOneBits_fd88b2();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl b/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl
deleted file mode 100644
index c5a0853..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(vec<2, u32>) -> vec<2, u32>
-fn countTrailingZeros_1ad138() {
-  var res: vec2<u32> = countTrailingZeros(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_1ad138();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_1ad138();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_1ad138();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl b/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl
deleted file mode 100644
index 1d30317..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(vec<4, i32>) -> vec<4, i32>
-fn countTrailingZeros_1dc84a() {
-  var res: vec4<i32> = countTrailingZeros(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_1dc84a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_1dc84a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_1dc84a();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl b/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl
deleted file mode 100644
index e266671..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(u32) -> u32
-fn countTrailingZeros_21e394() {
-  var res: u32 = countTrailingZeros(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_21e394();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_21e394();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_21e394();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl b/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl
deleted file mode 100644
index 2aca57f..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(vec<2, i32>) -> vec<2, i32>
-fn countTrailingZeros_327c37() {
-  var res: vec2<i32> = countTrailingZeros(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_327c37();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_327c37();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_327c37();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl b/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl
deleted file mode 100644
index 6006270..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(i32) -> i32
-fn countTrailingZeros_42fed6() {
-  var res: i32 = countTrailingZeros(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_42fed6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_42fed6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_42fed6();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl b/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl
deleted file mode 100644
index 967f800..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(vec<3, u32>) -> vec<3, u32>
-fn countTrailingZeros_8ed26f() {
-  var res: vec3<u32> = countTrailingZeros(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_8ed26f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_8ed26f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_8ed26f();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl b/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl
deleted file mode 100644
index 3ba9cde..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(vec<3, i32>) -> vec<3, i32>
-fn countTrailingZeros_acfacb() {
-  var res: vec3<i32> = countTrailingZeros(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_acfacb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_acfacb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_acfacb();
-}
diff --git a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl b/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl
deleted file mode 100644
index 71eb20d..0000000
--- a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn countTrailingZeros(vec<4, u32>) -> vec<4, u32>
-fn countTrailingZeros_d2b4a0() {
-  var res: vec4<u32> = countTrailingZeros(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  countTrailingZeros_d2b4a0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  countTrailingZeros_d2b4a0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  countTrailingZeros_d2b4a0();
-}
diff --git a/test/tint/builtins/gen/cross/041cb0.wgsl b/test/tint/builtins/gen/cross/041cb0.wgsl
deleted file mode 100644
index 91dc4dd1..0000000
--- a/test/tint/builtins/gen/cross/041cb0.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn cross(vec3<f32>, vec3<f32>) -> vec3<f32>
-fn cross_041cb0() {
-  var res: vec3<f32> = cross(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  cross_041cb0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  cross_041cb0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  cross_041cb0();
-}
diff --git a/test/tint/builtins/gen/degrees/0d170c.wgsl b/test/tint/builtins/gen/degrees/0d170c.wgsl
deleted file mode 100644
index ea8d9b0..0000000
--- a/test/tint/builtins/gen/degrees/0d170c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn degrees(vec<4, f32>) -> vec<4, f32>
-fn degrees_0d170c() {
-  var res: vec4<f32> = degrees(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  degrees_0d170c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  degrees_0d170c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  degrees_0d170c();
-}
diff --git a/test/tint/builtins/gen/degrees/1ad5df.wgsl b/test/tint/builtins/gen/degrees/1ad5df.wgsl
deleted file mode 100644
index 5aefd49..0000000
--- a/test/tint/builtins/gen/degrees/1ad5df.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn degrees(vec<2, f32>) -> vec<2, f32>
-fn degrees_1ad5df() {
-  var res: vec2<f32> = degrees(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  degrees_1ad5df();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  degrees_1ad5df();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  degrees_1ad5df();
-}
diff --git a/test/tint/builtins/gen/degrees/2af623.wgsl b/test/tint/builtins/gen/degrees/2af623.wgsl
deleted file mode 100644
index a348fb1..0000000
--- a/test/tint/builtins/gen/degrees/2af623.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn degrees(vec<3, f32>) -> vec<3, f32>
-fn degrees_2af623() {
-  var res: vec3<f32> = degrees(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  degrees_2af623();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  degrees_2af623();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  degrees_2af623();
-}
diff --git a/test/tint/builtins/gen/degrees/51f705.wgsl b/test/tint/builtins/gen/degrees/51f705.wgsl
deleted file mode 100644
index 54b7f32..0000000
--- a/test/tint/builtins/gen/degrees/51f705.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn degrees(f32) -> f32
-fn degrees_51f705() {
-  var res: f32 = degrees(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  degrees_51f705();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  degrees_51f705();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  degrees_51f705();
-}
diff --git a/test/tint/builtins/gen/determinant/2b62ba.wgsl b/test/tint/builtins/gen/determinant/2b62ba.wgsl
deleted file mode 100644
index c409909..0000000
--- a/test/tint/builtins/gen/determinant/2b62ba.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn determinant(mat<3, 3, f32>) -> f32
-fn determinant_2b62ba() {
-  var res: f32 = determinant(mat3x3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  determinant_2b62ba();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  determinant_2b62ba();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  determinant_2b62ba();
-}
diff --git a/test/tint/builtins/gen/determinant/a0a87c.wgsl b/test/tint/builtins/gen/determinant/a0a87c.wgsl
deleted file mode 100644
index e247511..0000000
--- a/test/tint/builtins/gen/determinant/a0a87c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn determinant(mat<4, 4, f32>) -> f32
-fn determinant_a0a87c() {
-  var res: f32 = determinant(mat4x4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  determinant_a0a87c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  determinant_a0a87c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  determinant_a0a87c();
-}
diff --git a/test/tint/builtins/gen/determinant/e19305.wgsl b/test/tint/builtins/gen/determinant/e19305.wgsl
deleted file mode 100644
index 6586681..0000000
--- a/test/tint/builtins/gen/determinant/e19305.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn determinant(mat<2, 2, f32>) -> f32
-fn determinant_e19305() {
-  var res: f32 = determinant(mat2x2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  determinant_e19305();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  determinant_e19305();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  determinant_e19305();
-}
diff --git a/test/tint/builtins/gen/distance/0657d4.wgsl b/test/tint/builtins/gen/distance/0657d4.wgsl
deleted file mode 100644
index 760f003..0000000
--- a/test/tint/builtins/gen/distance/0657d4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn distance(vec<3, f32>, vec<3, f32>) -> f32
-fn distance_0657d4() {
-  var res: f32 = distance(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  distance_0657d4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  distance_0657d4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  distance_0657d4();
-}
diff --git a/test/tint/builtins/gen/distance/9646ea.wgsl b/test/tint/builtins/gen/distance/9646ea.wgsl
deleted file mode 100644
index d4ff160..0000000
--- a/test/tint/builtins/gen/distance/9646ea.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn distance(vec<4, f32>, vec<4, f32>) -> f32
-fn distance_9646ea() {
-  var res: f32 = distance(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  distance_9646ea();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  distance_9646ea();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  distance_9646ea();
-}
diff --git a/test/tint/builtins/gen/distance/aa4055.wgsl b/test/tint/builtins/gen/distance/aa4055.wgsl
deleted file mode 100644
index 742f576..0000000
--- a/test/tint/builtins/gen/distance/aa4055.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn distance(vec<2, f32>, vec<2, f32>) -> f32
-fn distance_aa4055() {
-  var res: f32 = distance(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  distance_aa4055();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  distance_aa4055();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  distance_aa4055();
-}
diff --git a/test/tint/builtins/gen/distance/cfed73.wgsl b/test/tint/builtins/gen/distance/cfed73.wgsl
deleted file mode 100644
index ab06206..0000000
--- a/test/tint/builtins/gen/distance/cfed73.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn distance(f32, f32) -> f32
-fn distance_cfed73() {
-  var res: f32 = distance(1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  distance_cfed73();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  distance_cfed73();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  distance_cfed73();
-}
diff --git a/test/tint/builtins/gen/dot/0c577b.wgsl b/test/tint/builtins/gen/dot/0c577b.wgsl
deleted file mode 100644
index 4580e0d..0000000
--- a/test/tint/builtins/gen/dot/0c577b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<4, f32>, vec<4, f32>) -> f32
-fn dot_0c577b() {
-  var res: f32 = dot(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_0c577b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_0c577b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_0c577b();
-}
diff --git a/test/tint/builtins/gen/dot/7548a0.wgsl b/test/tint/builtins/gen/dot/7548a0.wgsl
deleted file mode 100644
index 2b0fccf..0000000
--- a/test/tint/builtins/gen/dot/7548a0.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<3, u32>, vec<3, u32>) -> u32
-fn dot_7548a0() {
-  var res: u32 = dot(vec3<u32>(), vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_7548a0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_7548a0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_7548a0();
-}
diff --git a/test/tint/builtins/gen/dot/883f0e.wgsl b/test/tint/builtins/gen/dot/883f0e.wgsl
deleted file mode 100644
index 06618c1..0000000
--- a/test/tint/builtins/gen/dot/883f0e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<2, f32>, vec<2, f32>) -> f32
-fn dot_883f0e() {
-  var res: f32 = dot(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_883f0e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_883f0e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_883f0e();
-}
diff --git a/test/tint/builtins/gen/dot/97c7ee.wgsl b/test/tint/builtins/gen/dot/97c7ee.wgsl
deleted file mode 100644
index d2dc8a4..0000000
--- a/test/tint/builtins/gen/dot/97c7ee.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<2, u32>, vec<2, u32>) -> u32
-fn dot_97c7ee() {
-  var res: u32 = dot(vec2<u32>(), vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_97c7ee();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_97c7ee();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_97c7ee();
-}
diff --git a/test/tint/builtins/gen/dot/ba4246.wgsl b/test/tint/builtins/gen/dot/ba4246.wgsl
deleted file mode 100644
index 867556a..0000000
--- a/test/tint/builtins/gen/dot/ba4246.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<3, f32>, vec<3, f32>) -> f32
-fn dot_ba4246() {
-  var res: f32 = dot(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_ba4246();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_ba4246();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_ba4246();
-}
diff --git a/test/tint/builtins/gen/dot/e994c7.wgsl b/test/tint/builtins/gen/dot/e994c7.wgsl
deleted file mode 100644
index 02ce1d0..0000000
--- a/test/tint/builtins/gen/dot/e994c7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<4, u32>, vec<4, u32>) -> u32
-fn dot_e994c7() {
-  var res: u32 = dot(vec4<u32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_e994c7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_e994c7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_e994c7();
-}
diff --git a/test/tint/builtins/gen/dot/ef6b1d.wgsl b/test/tint/builtins/gen/dot/ef6b1d.wgsl
deleted file mode 100644
index be5a79e..0000000
--- a/test/tint/builtins/gen/dot/ef6b1d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<4, i32>, vec<4, i32>) -> i32
-fn dot_ef6b1d() {
-  var res: i32 = dot(vec4<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_ef6b1d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_ef6b1d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_ef6b1d();
-}
diff --git a/test/tint/builtins/gen/dot/f1312c.wgsl b/test/tint/builtins/gen/dot/f1312c.wgsl
deleted file mode 100644
index 32e1075..0000000
--- a/test/tint/builtins/gen/dot/f1312c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<3, i32>, vec<3, i32>) -> i32
-fn dot_f1312c() {
-  var res: i32 = dot(vec3<i32>(), vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_f1312c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_f1312c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_f1312c();
-}
diff --git a/test/tint/builtins/gen/dot/fc5f7c.wgsl b/test/tint/builtins/gen/dot/fc5f7c.wgsl
deleted file mode 100644
index 5cd141d..0000000
--- a/test/tint/builtins/gen/dot/fc5f7c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dot(vec<2, i32>, vec<2, i32>) -> i32
-fn dot_fc5f7c() {
-  var res: i32 = dot(vec2<i32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  dot_fc5f7c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dot_fc5f7c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  dot_fc5f7c();
-}
diff --git a/test/tint/builtins/gen/dpdx/0763f7.wgsl b/test/tint/builtins/gen/dpdx/0763f7.wgsl
deleted file mode 100644
index 8c44f2a..0000000
--- a/test/tint/builtins/gen/dpdx/0763f7.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdx(vec<3, f32>) -> vec<3, f32>
-fn dpdx_0763f7() {
-  var res: vec3<f32> = dpdx(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdx_0763f7();
-}
diff --git a/test/tint/builtins/gen/dpdx/99edb1.wgsl b/test/tint/builtins/gen/dpdx/99edb1.wgsl
deleted file mode 100644
index 3231b03..0000000
--- a/test/tint/builtins/gen/dpdx/99edb1.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdx(vec<2, f32>) -> vec<2, f32>
-fn dpdx_99edb1() {
-  var res: vec2<f32> = dpdx(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdx_99edb1();
-}
diff --git a/test/tint/builtins/gen/dpdx/c487fa.wgsl b/test/tint/builtins/gen/dpdx/c487fa.wgsl
deleted file mode 100644
index 857bad4..0000000
--- a/test/tint/builtins/gen/dpdx/c487fa.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdx(vec<4, f32>) -> vec<4, f32>
-fn dpdx_c487fa() {
-  var res: vec4<f32> = dpdx(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdx_c487fa();
-}
diff --git a/test/tint/builtins/gen/dpdx/e263de.wgsl b/test/tint/builtins/gen/dpdx/e263de.wgsl
deleted file mode 100644
index a95caa7..0000000
--- a/test/tint/builtins/gen/dpdx/e263de.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdx(f32) -> f32
-fn dpdx_e263de() {
-  var res: f32 = dpdx(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdx_e263de();
-}
diff --git a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl b/test/tint/builtins/gen/dpdxCoarse/029152.wgsl
deleted file mode 100644
index 86d126d..0000000
--- a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxCoarse(f32) -> f32
-fn dpdxCoarse_029152() {
-  var res: f32 = dpdxCoarse(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxCoarse_029152();
-}
diff --git a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl b/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl
deleted file mode 100644
index 54dd7e4..0000000
--- a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxCoarse(vec<2, f32>) -> vec<2, f32>
-fn dpdxCoarse_9581cf() {
-  var res: vec2<f32> = dpdxCoarse(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxCoarse_9581cf();
-}
diff --git a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl b/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl
deleted file mode 100644
index 20ae7bf..0000000
--- a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxCoarse(vec<4, f32>) -> vec<4, f32>
-fn dpdxCoarse_c28641() {
-  var res: vec4<f32> = dpdxCoarse(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxCoarse_c28641();
-}
diff --git a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl b/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl
deleted file mode 100644
index 81681e5..0000000
--- a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxCoarse(vec<3, f32>) -> vec<3, f32>
-fn dpdxCoarse_f64d7b() {
-  var res: vec3<f32> = dpdxCoarse(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxCoarse_f64d7b();
-}
diff --git a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl b/test/tint/builtins/gen/dpdxFine/8c5069.wgsl
deleted file mode 100644
index 1b4274d..0000000
--- a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxFine(vec<4, f32>) -> vec<4, f32>
-fn dpdxFine_8c5069() {
-  var res: vec4<f32> = dpdxFine(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxFine_8c5069();
-}
diff --git a/test/tint/builtins/gen/dpdxFine/9631de.wgsl b/test/tint/builtins/gen/dpdxFine/9631de.wgsl
deleted file mode 100644
index 847a81c..0000000
--- a/test/tint/builtins/gen/dpdxFine/9631de.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxFine(vec<2, f32>) -> vec<2, f32>
-fn dpdxFine_9631de() {
-  var res: vec2<f32> = dpdxFine(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxFine_9631de();
-}
diff --git a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl b/test/tint/builtins/gen/dpdxFine/f401a2.wgsl
deleted file mode 100644
index de0a8b2..0000000
--- a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxFine(f32) -> f32
-fn dpdxFine_f401a2() {
-  var res: f32 = dpdxFine(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxFine_f401a2();
-}
diff --git a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl b/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl
deleted file mode 100644
index 85f9d43..0000000
--- a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdxFine(vec<3, f32>) -> vec<3, f32>
-fn dpdxFine_f92fb6() {
-  var res: vec3<f32> = dpdxFine(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdxFine_f92fb6();
-}
diff --git a/test/tint/builtins/gen/dpdy/699a05.wgsl b/test/tint/builtins/gen/dpdy/699a05.wgsl
deleted file mode 100644
index b2255a0..0000000
--- a/test/tint/builtins/gen/dpdy/699a05.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdy(vec<4, f32>) -> vec<4, f32>
-fn dpdy_699a05() {
-  var res: vec4<f32> = dpdy(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdy_699a05();
-}
diff --git a/test/tint/builtins/gen/dpdy/7f8d84.wgsl b/test/tint/builtins/gen/dpdy/7f8d84.wgsl
deleted file mode 100644
index 00fe00e..0000000
--- a/test/tint/builtins/gen/dpdy/7f8d84.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdy(f32) -> f32
-fn dpdy_7f8d84() {
-  var res: f32 = dpdy(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdy_7f8d84();
-}
diff --git a/test/tint/builtins/gen/dpdy/a8b56e.wgsl b/test/tint/builtins/gen/dpdy/a8b56e.wgsl
deleted file mode 100644
index e9fe4e6..0000000
--- a/test/tint/builtins/gen/dpdy/a8b56e.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdy(vec<2, f32>) -> vec<2, f32>
-fn dpdy_a8b56e() {
-  var res: vec2<f32> = dpdy(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdy_a8b56e();
-}
diff --git a/test/tint/builtins/gen/dpdy/feb40f.wgsl b/test/tint/builtins/gen/dpdy/feb40f.wgsl
deleted file mode 100644
index 6e56265..0000000
--- a/test/tint/builtins/gen/dpdy/feb40f.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdy(vec<3, f32>) -> vec<3, f32>
-fn dpdy_feb40f() {
-  var res: vec3<f32> = dpdy(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdy_feb40f();
-}
diff --git a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl b/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl
deleted file mode 100644
index e29e794..0000000
--- a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyCoarse(vec<2, f32>) -> vec<2, f32>
-fn dpdyCoarse_3e1ab4() {
-  var res: vec2<f32> = dpdyCoarse(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyCoarse_3e1ab4();
-}
diff --git a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl b/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl
deleted file mode 100644
index 8f4045d..0000000
--- a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyCoarse(vec<4, f32>) -> vec<4, f32>
-fn dpdyCoarse_445d24() {
-  var res: vec4<f32> = dpdyCoarse(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyCoarse_445d24();
-}
diff --git a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl b/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl
deleted file mode 100644
index ec41cef..0000000
--- a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyCoarse(f32) -> f32
-fn dpdyCoarse_870a7e() {
-  var res: f32 = dpdyCoarse(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyCoarse_870a7e();
-}
diff --git a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl b/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl
deleted file mode 100644
index ac3ea31..0000000
--- a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyCoarse(vec<3, f32>) -> vec<3, f32>
-fn dpdyCoarse_ae1873() {
-  var res: vec3<f32> = dpdyCoarse(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyCoarse_ae1873();
-}
diff --git a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl b/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl
deleted file mode 100644
index fd7c18c..0000000
--- a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyFine(vec<3, f32>) -> vec<3, f32>
-fn dpdyFine_1fb7ab() {
-  var res: vec3<f32> = dpdyFine(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyFine_1fb7ab();
-}
diff --git a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl b/test/tint/builtins/gen/dpdyFine/6eb673.wgsl
deleted file mode 100644
index 2477a40..0000000
--- a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyFine(f32) -> f32
-fn dpdyFine_6eb673() {
-  var res: f32 = dpdyFine(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyFine_6eb673();
-}
diff --git a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl b/test/tint/builtins/gen/dpdyFine/d0a648.wgsl
deleted file mode 100644
index 7bc1312..0000000
--- a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyFine(vec<4, f32>) -> vec<4, f32>
-fn dpdyFine_d0a648() {
-  var res: vec4<f32> = dpdyFine(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyFine_d0a648();
-}
diff --git a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl b/test/tint/builtins/gen/dpdyFine/df33aa.wgsl
deleted file mode 100644
index 0a10ff4..0000000
--- a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn dpdyFine(vec<2, f32>) -> vec<2, f32>
-fn dpdyFine_df33aa() {
-  var res: vec2<f32> = dpdyFine(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  dpdyFine_df33aa();
-}
diff --git a/test/tint/builtins/gen/exp/0f70eb.wgsl b/test/tint/builtins/gen/exp/0f70eb.wgsl
deleted file mode 100644
index c72f26d..0000000
--- a/test/tint/builtins/gen/exp/0f70eb.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp(vec<4, f32>) -> vec<4, f32>
-fn exp_0f70eb() {
-  var res: vec4<f32> = exp(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp_0f70eb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp_0f70eb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp_0f70eb();
-}
diff --git a/test/tint/builtins/gen/exp/1951e7.wgsl b/test/tint/builtins/gen/exp/1951e7.wgsl
deleted file mode 100644
index a7de999..0000000
--- a/test/tint/builtins/gen/exp/1951e7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp(vec<2, f32>) -> vec<2, f32>
-fn exp_1951e7() {
-  var res: vec2<f32> = exp(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp_1951e7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp_1951e7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp_1951e7();
-}
diff --git a/test/tint/builtins/gen/exp/771fd2.wgsl b/test/tint/builtins/gen/exp/771fd2.wgsl
deleted file mode 100644
index 9361a21..0000000
--- a/test/tint/builtins/gen/exp/771fd2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp(f32) -> f32
-fn exp_771fd2() {
-  var res: f32 = exp(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp_771fd2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp_771fd2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp_771fd2();
-}
diff --git a/test/tint/builtins/gen/exp/d98450.wgsl b/test/tint/builtins/gen/exp/d98450.wgsl
deleted file mode 100644
index d3d666f..0000000
--- a/test/tint/builtins/gen/exp/d98450.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp(vec<3, f32>) -> vec<3, f32>
-fn exp_d98450() {
-  var res: vec3<f32> = exp(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp_d98450();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp_d98450();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp_d98450();
-}
diff --git a/test/tint/builtins/gen/exp2/1f8680.wgsl b/test/tint/builtins/gen/exp2/1f8680.wgsl
deleted file mode 100644
index 334932c..0000000
--- a/test/tint/builtins/gen/exp2/1f8680.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp2(vec<3, f32>) -> vec<3, f32>
-fn exp2_1f8680() {
-  var res: vec3<f32> = exp2(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp2_1f8680();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp2_1f8680();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp2_1f8680();
-}
diff --git a/test/tint/builtins/gen/exp2/a9d0a7.wgsl b/test/tint/builtins/gen/exp2/a9d0a7.wgsl
deleted file mode 100644
index 31bfbbb..0000000
--- a/test/tint/builtins/gen/exp2/a9d0a7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp2(vec<4, f32>) -> vec<4, f32>
-fn exp2_a9d0a7() {
-  var res: vec4<f32> = exp2(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp2_a9d0a7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp2_a9d0a7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp2_a9d0a7();
-}
diff --git a/test/tint/builtins/gen/exp2/d6777c.wgsl b/test/tint/builtins/gen/exp2/d6777c.wgsl
deleted file mode 100644
index ee1044e..0000000
--- a/test/tint/builtins/gen/exp2/d6777c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp2(vec<2, f32>) -> vec<2, f32>
-fn exp2_d6777c() {
-  var res: vec2<f32> = exp2(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp2_d6777c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp2_d6777c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp2_d6777c();
-}
diff --git a/test/tint/builtins/gen/exp2/dea523.wgsl b/test/tint/builtins/gen/exp2/dea523.wgsl
deleted file mode 100644
index 65a879c..0000000
--- a/test/tint/builtins/gen/exp2/dea523.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn exp2(f32) -> f32
-fn exp2_dea523() {
-  var res: f32 = exp2(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  exp2_dea523();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  exp2_dea523();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  exp2_dea523();
-}
diff --git a/test/tint/builtins/gen/extractBits/12b197.wgsl b/test/tint/builtins/gen/extractBits/12b197.wgsl
deleted file mode 100644
index 7777e58..0000000
--- a/test/tint/builtins/gen/extractBits/12b197.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(vec<3, u32>, u32, u32) -> vec<3, u32>
-fn extractBits_12b197() {
-  var res: vec3<u32> = extractBits(vec3<u32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_12b197();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_12b197();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_12b197();
-}
diff --git a/test/tint/builtins/gen/extractBits/249874.wgsl b/test/tint/builtins/gen/extractBits/249874.wgsl
deleted file mode 100644
index 8f67de0..0000000
--- a/test/tint/builtins/gen/extractBits/249874.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(i32, u32, u32) -> i32
-fn extractBits_249874() {
-  var res: i32 = extractBits(1, 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_249874();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_249874();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_249874();
-}
diff --git a/test/tint/builtins/gen/extractBits/631377.wgsl b/test/tint/builtins/gen/extractBits/631377.wgsl
deleted file mode 100644
index 824f5a4..0000000
--- a/test/tint/builtins/gen/extractBits/631377.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(vec<4, u32>, u32, u32) -> vec<4, u32>
-fn extractBits_631377() {
-  var res: vec4<u32> = extractBits(vec4<u32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_631377();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_631377();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_631377();
-}
diff --git a/test/tint/builtins/gen/extractBits/a99a8d.wgsl b/test/tint/builtins/gen/extractBits/a99a8d.wgsl
deleted file mode 100644
index 7313723..0000000
--- a/test/tint/builtins/gen/extractBits/a99a8d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(vec<2, i32>, u32, u32) -> vec<2, i32>
-fn extractBits_a99a8d() {
-  var res: vec2<i32> = extractBits(vec2<i32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_a99a8d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_a99a8d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_a99a8d();
-}
diff --git a/test/tint/builtins/gen/extractBits/ce81f8.wgsl b/test/tint/builtins/gen/extractBits/ce81f8.wgsl
deleted file mode 100644
index c546e96..0000000
--- a/test/tint/builtins/gen/extractBits/ce81f8.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(u32, u32, u32) -> u32
-fn extractBits_ce81f8() {
-  var res: u32 = extractBits(1u, 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_ce81f8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_ce81f8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_ce81f8();
-}
diff --git a/test/tint/builtins/gen/extractBits/e04f5d.wgsl b/test/tint/builtins/gen/extractBits/e04f5d.wgsl
deleted file mode 100644
index 783ae66..0000000
--- a/test/tint/builtins/gen/extractBits/e04f5d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(vec<3, i32>, u32, u32) -> vec<3, i32>
-fn extractBits_e04f5d() {
-  var res: vec3<i32> = extractBits(vec3<i32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_e04f5d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_e04f5d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_e04f5d();
-}
diff --git a/test/tint/builtins/gen/extractBits/f28f69.wgsl b/test/tint/builtins/gen/extractBits/f28f69.wgsl
deleted file mode 100644
index e98dd97..0000000
--- a/test/tint/builtins/gen/extractBits/f28f69.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(vec<2, u32>, u32, u32) -> vec<2, u32>
-fn extractBits_f28f69() {
-  var res: vec2<u32> = extractBits(vec2<u32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_f28f69();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_f28f69();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_f28f69();
-}
diff --git a/test/tint/builtins/gen/extractBits/fb850f.wgsl b/test/tint/builtins/gen/extractBits/fb850f.wgsl
deleted file mode 100644
index 7327933..0000000
--- a/test/tint/builtins/gen/extractBits/fb850f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn extractBits(vec<4, i32>, u32, u32) -> vec<4, i32>
-fn extractBits_fb850f() {
-  var res: vec4<i32> = extractBits(vec4<i32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  extractBits_fb850f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  extractBits_fb850f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  extractBits_fb850f();
-}
diff --git a/test/tint/builtins/gen/faceForward/5afbd5.wgsl b/test/tint/builtins/gen/faceForward/5afbd5.wgsl
deleted file mode 100644
index 73c26b1..0000000
--- a/test/tint/builtins/gen/faceForward/5afbd5.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn faceForward(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn faceForward_5afbd5() {
-  var res: vec3<f32> = faceForward(vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  faceForward_5afbd5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  faceForward_5afbd5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  faceForward_5afbd5();
-}
diff --git a/test/tint/builtins/gen/faceForward/b316e5.wgsl b/test/tint/builtins/gen/faceForward/b316e5.wgsl
deleted file mode 100644
index 67d1031..0000000
--- a/test/tint/builtins/gen/faceForward/b316e5.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn faceForward(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn faceForward_b316e5() {
-  var res: vec4<f32> = faceForward(vec4<f32>(), vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  faceForward_b316e5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  faceForward_b316e5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  faceForward_b316e5();
-}
diff --git a/test/tint/builtins/gen/faceForward/e6908b.wgsl b/test/tint/builtins/gen/faceForward/e6908b.wgsl
deleted file mode 100644
index c101081..0000000
--- a/test/tint/builtins/gen/faceForward/e6908b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn faceForward(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn faceForward_e6908b() {
-  var res: vec2<f32> = faceForward(vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  faceForward_e6908b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  faceForward_e6908b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  faceForward_e6908b();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl b/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl
deleted file mode 100644
index 0a8a5da..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(vec<4, u32>) -> vec<4, u32>
-fn firstLeadingBit_000ff3() {
-  var res: vec4<u32> = firstLeadingBit(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_000ff3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_000ff3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_000ff3();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl b/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl
deleted file mode 100644
index 6fd1880..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(vec<3, i32>) -> vec<3, i32>
-fn firstLeadingBit_35053e() {
-  var res: vec3<i32> = firstLeadingBit(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_35053e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_35053e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_35053e();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl b/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl
deleted file mode 100644
index 3dcfca1..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(vec<3, u32>) -> vec<3, u32>
-fn firstLeadingBit_3fd7d0() {
-  var res: vec3<u32> = firstLeadingBit(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_3fd7d0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_3fd7d0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_3fd7d0();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl b/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl
deleted file mode 100644
index 7a77849..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(i32) -> i32
-fn firstLeadingBit_57a1a3() {
-  var res: i32 = firstLeadingBit(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_57a1a3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_57a1a3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_57a1a3();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl b/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl
deleted file mode 100644
index 6f22f4c..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(vec<2, u32>) -> vec<2, u32>
-fn firstLeadingBit_6fe804() {
-  var res: vec2<u32> = firstLeadingBit(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_6fe804();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_6fe804();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_6fe804();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl b/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl
deleted file mode 100644
index 9844324..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(vec<2, i32>) -> vec<2, i32>
-fn firstLeadingBit_a622c2() {
-  var res: vec2<i32> = firstLeadingBit(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_a622c2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_a622c2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_a622c2();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl b/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl
deleted file mode 100644
index 5b1610e..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(vec<4, i32>) -> vec<4, i32>
-fn firstLeadingBit_c1f940() {
-  var res: vec4<i32> = firstLeadingBit(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_c1f940();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_c1f940();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_c1f940();
-}
diff --git a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl b/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl
deleted file mode 100644
index 6d1365d..0000000
--- a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstLeadingBit(u32) -> u32
-fn firstLeadingBit_f0779d() {
-  var res: u32 = firstLeadingBit(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstLeadingBit_f0779d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstLeadingBit_f0779d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstLeadingBit_f0779d();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl b/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl
deleted file mode 100644
index 9128ec4..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(vec<4, u32>) -> vec<4, u32>
-fn firstTrailingBit_110f2c() {
-  var res: vec4<u32> = firstTrailingBit(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_110f2c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_110f2c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_110f2c();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl b/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl
deleted file mode 100644
index 7ac0acf..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(i32) -> i32
-fn firstTrailingBit_3a2acc() {
-  var res: i32 = firstTrailingBit(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_3a2acc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_3a2acc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_3a2acc();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl b/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl
deleted file mode 100644
index 05678e5..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(vec<2, u32>) -> vec<2, u32>
-fn firstTrailingBit_45eb10() {
-  var res: vec2<u32> = firstTrailingBit(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_45eb10();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_45eb10();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_45eb10();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl b/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl
deleted file mode 100644
index 43f7a72..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(u32) -> u32
-fn firstTrailingBit_47d475() {
-  var res: u32 = firstTrailingBit(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_47d475();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_47d475();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_47d475();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl b/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl
deleted file mode 100644
index faab74f..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(vec<2, i32>) -> vec<2, i32>
-fn firstTrailingBit_50c072() {
-  var res: vec2<i32> = firstTrailingBit(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_50c072();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_50c072();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_50c072();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl b/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl
deleted file mode 100644
index 5d106be..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(vec<3, i32>) -> vec<3, i32>
-fn firstTrailingBit_7496d6() {
-  var res: vec3<i32> = firstTrailingBit(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_7496d6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_7496d6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_7496d6();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl b/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl
deleted file mode 100644
index 5bf7d26..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(vec<4, i32>) -> vec<4, i32>
-fn firstTrailingBit_86551b() {
-  var res: vec4<i32> = firstTrailingBit(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_86551b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_86551b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_86551b();
-}
diff --git a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl b/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl
deleted file mode 100644
index 62ed98ef..0000000
--- a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn firstTrailingBit(vec<3, u32>) -> vec<3, u32>
-fn firstTrailingBit_cb51ce() {
-  var res: vec3<u32> = firstTrailingBit(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  firstTrailingBit_cb51ce();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  firstTrailingBit_cb51ce();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  firstTrailingBit_cb51ce();
-}
diff --git a/test/tint/builtins/gen/floor/3bccc4.wgsl b/test/tint/builtins/gen/floor/3bccc4.wgsl
deleted file mode 100644
index ac8b3d4..0000000
--- a/test/tint/builtins/gen/floor/3bccc4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn floor(vec<4, f32>) -> vec<4, f32>
-fn floor_3bccc4() {
-  var res: vec4<f32> = floor(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  floor_3bccc4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  floor_3bccc4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  floor_3bccc4();
-}
diff --git a/test/tint/builtins/gen/floor/5fc9ac.wgsl b/test/tint/builtins/gen/floor/5fc9ac.wgsl
deleted file mode 100644
index cdc9c45..0000000
--- a/test/tint/builtins/gen/floor/5fc9ac.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn floor(vec<2, f32>) -> vec<2, f32>
-fn floor_5fc9ac() {
-  var res: vec2<f32> = floor(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  floor_5fc9ac();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  floor_5fc9ac();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  floor_5fc9ac();
-}
diff --git a/test/tint/builtins/gen/floor/60d7ea.wgsl b/test/tint/builtins/gen/floor/60d7ea.wgsl
deleted file mode 100644
index a8bf8b6..0000000
--- a/test/tint/builtins/gen/floor/60d7ea.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn floor(vec<3, f32>) -> vec<3, f32>
-fn floor_60d7ea() {
-  var res: vec3<f32> = floor(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  floor_60d7ea();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  floor_60d7ea();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  floor_60d7ea();
-}
diff --git a/test/tint/builtins/gen/floor/66f154.wgsl b/test/tint/builtins/gen/floor/66f154.wgsl
deleted file mode 100644
index 1f0c1f8..0000000
--- a/test/tint/builtins/gen/floor/66f154.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn floor(f32) -> f32
-fn floor_66f154() {
-  var res: f32 = floor(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  floor_66f154();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  floor_66f154();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  floor_66f154();
-}
diff --git a/test/tint/builtins/gen/fma/26a7a9.wgsl b/test/tint/builtins/gen/fma/26a7a9.wgsl
deleted file mode 100644
index 8d1b31a..0000000
--- a/test/tint/builtins/gen/fma/26a7a9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fma(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn fma_26a7a9() {
-  var res: vec2<f32> = fma(vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fma_26a7a9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fma_26a7a9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fma_26a7a9();
-}
diff --git a/test/tint/builtins/gen/fma/6a3283.wgsl b/test/tint/builtins/gen/fma/6a3283.wgsl
deleted file mode 100644
index 7304803..0000000
--- a/test/tint/builtins/gen/fma/6a3283.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fma(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn fma_6a3283() {
-  var res: vec4<f32> = fma(vec4<f32>(), vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fma_6a3283();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fma_6a3283();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fma_6a3283();
-}
diff --git a/test/tint/builtins/gen/fma/c10ba3.wgsl b/test/tint/builtins/gen/fma/c10ba3.wgsl
deleted file mode 100644
index b7099cc..0000000
--- a/test/tint/builtins/gen/fma/c10ba3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fma(f32, f32, f32) -> f32
-fn fma_c10ba3() {
-  var res: f32 = fma(1.0, 1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fma_c10ba3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fma_c10ba3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fma_c10ba3();
-}
diff --git a/test/tint/builtins/gen/fma/e17c5c.wgsl b/test/tint/builtins/gen/fma/e17c5c.wgsl
deleted file mode 100644
index 1729e62..0000000
--- a/test/tint/builtins/gen/fma/e17c5c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fma(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn fma_e17c5c() {
-  var res: vec3<f32> = fma(vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fma_e17c5c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fma_e17c5c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fma_e17c5c();
-}
diff --git a/test/tint/builtins/gen/fract/8bc1e9.wgsl b/test/tint/builtins/gen/fract/8bc1e9.wgsl
deleted file mode 100644
index 2e3663b..0000000
--- a/test/tint/builtins/gen/fract/8bc1e9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fract(vec<4, f32>) -> vec<4, f32>
-fn fract_8bc1e9() {
-  var res: vec4<f32> = fract(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fract_8bc1e9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fract_8bc1e9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fract_8bc1e9();
-}
diff --git a/test/tint/builtins/gen/fract/943cb1.wgsl b/test/tint/builtins/gen/fract/943cb1.wgsl
deleted file mode 100644
index 940f469..0000000
--- a/test/tint/builtins/gen/fract/943cb1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fract(vec<2, f32>) -> vec<2, f32>
-fn fract_943cb1() {
-  var res: vec2<f32> = fract(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fract_943cb1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fract_943cb1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fract_943cb1();
-}
diff --git a/test/tint/builtins/gen/fract/a49758.wgsl b/test/tint/builtins/gen/fract/a49758.wgsl
deleted file mode 100644
index e8d73a0..0000000
--- a/test/tint/builtins/gen/fract/a49758.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fract(vec<3, f32>) -> vec<3, f32>
-fn fract_a49758() {
-  var res: vec3<f32> = fract(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fract_a49758();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fract_a49758();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fract_a49758();
-}
diff --git a/test/tint/builtins/gen/fract/fa5c71.wgsl b/test/tint/builtins/gen/fract/fa5c71.wgsl
deleted file mode 100644
index ec0fed4..0000000
--- a/test/tint/builtins/gen/fract/fa5c71.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fract(f32) -> f32
-fn fract_fa5c71() {
-  var res: f32 = fract(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  fract_fa5c71();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fract_fa5c71();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  fract_fa5c71();
-}
diff --git a/test/tint/builtins/gen/frexp/368997.wgsl b/test/tint/builtins/gen/frexp/368997.wgsl
deleted file mode 100644
index 57930ed..0000000
--- a/test/tint/builtins/gen/frexp/368997.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn frexp(vec<3, f32>) -> __frexp_result_vec<3>
-fn frexp_368997() {
-  var res = frexp(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  frexp_368997();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  frexp_368997();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  frexp_368997();
-}
diff --git a/test/tint/builtins/gen/frexp/3c4f48.wgsl b/test/tint/builtins/gen/frexp/3c4f48.wgsl
deleted file mode 100644
index 74a8ef1..0000000
--- a/test/tint/builtins/gen/frexp/3c4f48.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn frexp(vec<4, f32>) -> __frexp_result_vec<4>
-fn frexp_3c4f48() {
-  var res = frexp(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  frexp_3c4f48();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  frexp_3c4f48();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  frexp_3c4f48();
-}
diff --git a/test/tint/builtins/gen/frexp/4bdfc7.wgsl b/test/tint/builtins/gen/frexp/4bdfc7.wgsl
deleted file mode 100644
index c947178..0000000
--- a/test/tint/builtins/gen/frexp/4bdfc7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn frexp(vec<2, f32>) -> __frexp_result_vec<2>
-fn frexp_4bdfc7() {
-  var res = frexp(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  frexp_4bdfc7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  frexp_4bdfc7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  frexp_4bdfc7();
-}
diff --git a/test/tint/builtins/gen/frexp/eabd40.wgsl b/test/tint/builtins/gen/frexp/eabd40.wgsl
deleted file mode 100644
index 9eeab1d..0000000
--- a/test/tint/builtins/gen/frexp/eabd40.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn frexp(f32) -> __frexp_result
-fn frexp_eabd40() {
-  var res = frexp(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  frexp_eabd40();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  frexp_eabd40();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  frexp_eabd40();
-}
diff --git a/test/tint/builtins/gen/fwidth/5d1b39.wgsl b/test/tint/builtins/gen/fwidth/5d1b39.wgsl
deleted file mode 100644
index b0f3e21..0000000
--- a/test/tint/builtins/gen/fwidth/5d1b39.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidth(vec<3, f32>) -> vec<3, f32>
-fn fwidth_5d1b39() {
-  var res: vec3<f32> = fwidth(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidth_5d1b39();
-}
diff --git a/test/tint/builtins/gen/fwidth/b83ebb.wgsl b/test/tint/builtins/gen/fwidth/b83ebb.wgsl
deleted file mode 100644
index d4d9fd7..0000000
--- a/test/tint/builtins/gen/fwidth/b83ebb.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidth(vec<2, f32>) -> vec<2, f32>
-fn fwidth_b83ebb() {
-  var res: vec2<f32> = fwidth(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidth_b83ebb();
-}
diff --git a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl b/test/tint/builtins/gen/fwidth/d2ab9a.wgsl
deleted file mode 100644
index 81dbd35..0000000
--- a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidth(vec<4, f32>) -> vec<4, f32>
-fn fwidth_d2ab9a() {
-  var res: vec4<f32> = fwidth(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidth_d2ab9a();
-}
diff --git a/test/tint/builtins/gen/fwidth/df38ef.wgsl b/test/tint/builtins/gen/fwidth/df38ef.wgsl
deleted file mode 100644
index 3392f90..0000000
--- a/test/tint/builtins/gen/fwidth/df38ef.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidth(f32) -> f32
-fn fwidth_df38ef() {
-  var res: f32 = fwidth(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidth_df38ef();
-}
diff --git a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl b/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl
deleted file mode 100644
index bada6df..0000000
--- a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthCoarse(f32) -> f32
-fn fwidthCoarse_159c8a() {
-  var res: f32 = fwidthCoarse(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthCoarse_159c8a();
-}
diff --git a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl b/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl
deleted file mode 100644
index 54a3324..0000000
--- a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthCoarse(vec<3, f32>) -> vec<3, f32>
-fn fwidthCoarse_1e59d9() {
-  var res: vec3<f32> = fwidthCoarse(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthCoarse_1e59d9();
-}
diff --git a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl b/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl
deleted file mode 100644
index 236b9ed..0000000
--- a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthCoarse(vec<4, f32>) -> vec<4, f32>
-fn fwidthCoarse_4e4fc4() {
-  var res: vec4<f32> = fwidthCoarse(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthCoarse_4e4fc4();
-}
diff --git a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl b/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl
deleted file mode 100644
index 7bc209d..0000000
--- a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthCoarse(vec<2, f32>) -> vec<2, f32>
-fn fwidthCoarse_e653f7() {
-  var res: vec2<f32> = fwidthCoarse(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthCoarse_e653f7();
-}
diff --git a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl b/test/tint/builtins/gen/fwidthFine/523fdc.wgsl
deleted file mode 100644
index 7c95dd0..0000000
--- a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthFine(vec<3, f32>) -> vec<3, f32>
-fn fwidthFine_523fdc() {
-  var res: vec3<f32> = fwidthFine(vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthFine_523fdc();
-}
diff --git a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl b/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl
deleted file mode 100644
index 20fef19..0000000
--- a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthFine(vec<4, f32>) -> vec<4, f32>
-fn fwidthFine_68f4ef() {
-  var res: vec4<f32> = fwidthFine(vec4<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthFine_68f4ef();
-}
diff --git a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl b/test/tint/builtins/gen/fwidthFine/f1742d.wgsl
deleted file mode 100644
index d24600c..0000000
--- a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthFine(f32) -> f32
-fn fwidthFine_f1742d() {
-  var res: f32 = fwidthFine(1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthFine_f1742d();
-}
diff --git a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl b/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl
deleted file mode 100644
index 0002542..0000000
--- a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn fwidthFine(vec<2, f32>) -> vec<2, f32>
-fn fwidthFine_ff6aa0() {
-  var res: vec2<f32> = fwidthFine(vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  fwidthFine_ff6aa0();
-}
diff --git a/test/tint/builtins/gen/gen.wgsl.tmpl b/test/tint/builtins/gen/gen.wgsl.tmpl
new file mode 100644
index 0000000..d4360f4
--- /dev/null
+++ b/test/tint/builtins/gen/gen.wgsl.tmpl
@@ -0,0 +1,277 @@
+{{- /*
+--------------------------------------------------------------------------------
+Template file for use with tools/builtin-gen to generate the wgsl files in the
+./literal/... subdirectories
+
+See:
+* tools/cmd/intrinsic-gen/gen for structures used by this template
+* https://golang.org/pkg/text/template/ for documentation on the template syntax
+--------------------------------------------------------------------------------
+*/ -}}
+
+{{- /* For each permutation of each overload of each function... */ -}}
+{{- range .Sem.Builtins -}}
+{{- /* TODO(crbug.com/tint/1483): Remove the bodge below after smoothStep is removed from intrinsics.def */}}
+{{- /* TODO(crbug.com/tint/1536): Remove the bodge below after we support [[extension("extension_name")]] in intrinsics.def */}}
+{{- if not (or (eq .Name "smoothStep") (eq .Name "dot4I8Packed") (eq .Name "dot4U8Packed"))}}
+{{-   range .Overloads  -}}
+{{-     range Permute . -}}
+{{- /*    Generate a ./literal/<function>/<permuataion-hash>.wgsl file using
+          the Permutation macro defined below                             */ -}}
+{{-       $file := printf "./literal/%v/%v.wgsl" .Intrinsic.Name .Hash -}}
+{{-       $content := Eval "Permutation" . -}}
+{{-       WriteFile $file $content -}}
+{{-     end  }}
+{{-   end  }}
+{{- end  }}
+{{- end  }}
+
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                          define "Permutation"                            -}}
+{{- /* Emits the body of the intrinsic permuation .wgsl file              */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-   $builtin     := .Intrinsic.Name -}}
+{{-   $permutation := printf "%v_%v" $builtin .Hash -}}
+{{-   $args        := Map -}}
+
+{{- /* Generate RW storage buffer parameters */ -}}
+{{-   $sb_rw_fields := Eval "EmitBufferFields" "overload"    .
+                                               "var_name"    "sb_rw"
+                                               "storage"     "storage"
+                                               "access"      "read_write"
+                                               "args"        $args -}}
+{{-   if $sb_rw_fields -}}
+struct SB_RW {
+{{- $sb_rw_fields -}}
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+{{    end -}}
+
+{{- /* Generate RO storage buffer parameters */ -}}
+{{-   $sb_ro_fields := Eval "EmitBufferFields" "overload"    .
+                                               "var_name"    "sb_ro"
+                                               "storage"     "storage"
+                                               "access"      "read"
+                                               "args"        $args -}}
+{{-   if $sb_ro_fields -}}
+struct SB_RO {
+{{- $sb_ro_fields -}}
+};
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
+{{    end -}}
+
+{{- /* Generate uniform buffer parameters */ -}}
+{{-   $ub_fields := Eval "EmitBufferFields" "overload"    .
+                                            "var_name"    "ub"
+                                            "storage"     "uniform"
+                                            "access"      "read"
+                                            "args"        $args -}}
+{{-   if $ub_fields -}}
+struct UB {
+{{- $ub_fields -}}
+};
+@group(0) @binding(1) var<uniform> ub : UB;
+{{    end -}}
+
+{{- /* Generate module-scoped handle variables */ -}}
+{{-   range $i, $p := .Parameters  }}
+{{-     $class := Eval "StorageClass" $p.Type -}}
+{{-     if eq "ptr" $p.Type.Target.Name -}}
+{{-       $el_type := Eval "Type" (index $p.Type.TemplateArguments 1)}}
+{{-       if eq "handle" $class -}}
+            @group(1) @binding({{$i}}) var arg_{{$i}}: {{$el_type}};
+{{          $args.Put $i (printf "&arg_%v" $i) -}}
+{{-       else if eq "workgroup" $class -}}
+            var<workgroup> arg_{{$i}}: {{$el_type}};
+{{          $args.Put $i (printf "&arg_%v" $i) -}}
+{{-       else if eq "private" $class -}}
+            var<private> arg_{{$i}}: {{$el_type}};
+{{          $args.Put $i (printf "&arg_%v" $i) -}}
+{{-       end -}}
+{{-     else -}}
+{{-       $type := Eval "Type" $p.Type}}
+{{-       if eq "handle" $class -}}
+            @group(1) @binding({{$i}}) var arg_{{$i}}: {{$type}};
+{{          $args.Put $i (printf "arg_%v" $i) -}}
+{{-       else if eq "workgroup" $class -}}
+            var<workgroup> arg_{{$i}}: {{$type}};
+{{          $args.Put $i (printf "arg_%v" $i) -}}
+{{-       else if eq "private" $class -}}
+            var<private> arg_{{$i}}: {{$type}};
+{{          $args.Put $i (printf "arg_%v" $i) -}}
+{{-       end -}}
+{{-     end -}}
+{{-   end -}}
+
+{{- /* Generate the function that calls the intrinsic */ -}}
+{{- /*newline*/}}
+// {{$.Overload}}
+fn {{$permutation}}() {
+{{/* Build the parameters either as 'var' or inline values */ -}}
+{{-   range $i, $p := .Parameters -}}
+{{-     $class := Eval "StorageClass" $p.Type -}}
+{{-     if eq "function" $class -}}
+{{-       if eq "ptr" $p.Type.Target.Name -}}
+{{- /*indent*/}}  var arg_{{$i}}: {{template "Type" index $p.Type.TemplateArguments 1}};
+{{          $args.Put $i (printf "&arg_%v" $i) -}}
+{{-       else -}}
+{{-         $args.Put $i (Eval "ArgumentValue" $p) -}}
+{{-       end -}}
+{{-     end -}}
+{{-   end -}}
+
+{{- /* Make the call to the intrinsic */ -}}
+{{- /*indent*/}}  {{/*indent*/ -}}
+{{-   if .ReturnType -}}
+  var res{{if IsDeclarable .ReturnType}}: {{template "Type" .ReturnType}}{{end}} = {{/* preserve space after = */ -}}
+{{-   end -}}
+  {{$builtin}}(
+{{-   range $i, $p := .Parameters -}}
+{{-     if $i -}}, {{end}}{{$args.Get $i -}}
+{{-   end -}}
+  );
+}
+{{/*new line*/ -}}
+
+{{- if .CanBeUsedInStage.Vertex }}
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  {{$permutation}}();
+  return vec4<f32>();
+}
+{{ end -}}
+
+{{- if .CanBeUsedInStage.Fragment }}
+@stage(fragment)
+fn fragment_main() {
+  {{$permutation}}();
+}
+{{ end -}}
+
+{{- if .CanBeUsedInStage.Compute }}
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  {{$permutation}}();
+}
+{{ end -}}
+
+{{- end -}}
+
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                       define "EmitBufferFields"                          -}}
+{{- /* Emits a struct with the fields that match the given storage class  */ -}}
+{{- /* and access.                                                        */ -}}
+{{- /* Argument is a map with the following expected keys:                */ -}}
+{{- /*  'overload' - the current overload                                 */ -}}
+{{- /*  'var_name' - name of the variable of the structure type           */ -}}
+{{- /*  'storage'  - filtered storage class                               */ -}}
+{{- /*  'access'   - filtered access                                      */ -}}
+{{- /*  'args'     - argument map that's populated with the fields        */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{- $overload       := .Get "overload" -}}
+{{- $var_name       := .Get "var_name" -}}
+{{- $filter_storage := .Get "storage"  -}}
+{{- $filter_access  := .Get "access"   -}}
+{{- $args           := .Get "args"     -}}
+{{-   range $i, $p := $overload.Parameters  }}
+{{-     $storage := Eval "StorageClass" $p.Type -}}
+{{-     $access  := Eval "Access"       $p.Type -}}
+{{-     if and (eq $filter_storage $storage) (eq $filter_access $access) }}
+{{-       if eq "ptr" $p.Type.Target.Name  }}
+  arg_{{$i}}: {{template "Type" (index $p.Type.TemplateArguments 1)}},
+{{          $args.Put $i (printf "&%v.arg_%v" $var_name $i) -}}
+{{-       else  }}
+  arg_{{$i}}: {{template "Type" $p.Type}},
+{{          $args.Put $i (printf "%v.arg_%v" $var_name $i) -}}
+{{-       end -}}
+{{-     end -}}
+{{-   end -}}
+{{ end -}}
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                           define "StorageClass"                          -}}
+{{- /* Returns the storage class for the given Fully Qualified Name       */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-   $name := .Target.Name -}}
+{{-   if             eq $name "array"   -}}storage
+{{-   else if HasPrefix $name "texture" -}}handle
+{{-   else if HasPrefix $name "sampler" -}}handle
+{{-   else if        eq $name "ptr"     -}}{{(index .TemplateArguments 0).Target.Name}}
+{{-   else                              -}}function
+{{-   end -}}
+{{- end -}}
+
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                           define "Access"                                -}}
+{{- /* Returns the access for the given Fully Qualified Name              */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-   $name := .Target.Name -}}
+{{-   if eq $name "ptr"     -}}{{(index .TemplateArguments 2).Target.Name}}
+{{-   else -}}
+{{- /*  Emit the default for the storage class */ -}}
+{{- /*  https://gpuweb.github.io/gpuweb/wgsl/#storage-class */ -}}
+{{-     $storage := Eval "StorageClass" . -}}
+{{-          if eq $storage "function" -}}read_write
+{{-     else if eq $storage "private" -}}read_write
+{{-     else if eq $storage "workgroup" -}}read_write
+{{-     else if eq $storage "uniform" -}}read
+{{-     else if eq $storage "storage" -}}read
+{{-     else if eq $storage "handle" -}}read
+{{-     end -}}
+{{-   end -}}
+{{- end -}}
+
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                          define "ArgumentValue"                          -}}
+{{- /* Returns a value that can be used for the parameter argument        */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-   $ty := .Type -}}
+{{-   if      eq $ty.Target.Name "i32" -}}
+{{- /* If the parameter has the name 'level', then use '0' as the value.  */ -}}
+{{- /* Some texture arguments require the level parameter to be 0, and    */ -}}
+{{- /* constraint is not described in the definition file.                */ -}}
+{{-     if   eq .Name "level"            -}}0
+{{-     else                             -}}1
+{{-     end                              -}}
+{{-   else if eq $ty.Target.Name "u32" -}}1u
+{{-   else if eq $ty.Target.Name "f32" -}}1.0
+{{-   else                             -}}{{template "Type" $ty}}()
+{{-   end                              -}}
+{{- end -}}
+
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                                define "Type"                             -}}
+{{- /* Emits the WGSL for the Fully Qualified Name argument               */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-   if IsType .Target -}}
+{{-     if      eq .Target.Name "vec" -}}vec{{index .TemplateArguments 0}}<{{template "Type" index .TemplateArguments 1}}>
+{{-     else if eq .Target.Name "mat" -}}mat{{index .TemplateArguments 0}}x{{index .TemplateArguments 1}}<{{template "Type" index .TemplateArguments 2}}>
+{{-     else                          -}}{{.Target.Name}}{{template "TemplateArguments" .TemplateArguments}}
+{{-     end                           -}}
+{{-   else if IsEnumEntry   .Target   -}}{{.Target.Name}}
+{{-   else if IsEnumMatcher .Target   -}}{{(index .Target.Options 0).Name}}
+{{-   else                            -}}<unhandled-fully-qualified-name-target={{- printf "%T" .Target -}}>
+{{-   end                             -}}
+{{- end -}}
+
+
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-                          define "TemplateArguments"                      -}}
+{{- /* Emits the WGSL for the template argument list                      */ -}}
+{{- /* ------------------------------------------------------------------ */ -}}
+{{-   if . -}}
+<
+{{-    range $i, $a := . -}}
+{{-      if $i -}}, {{  end -}}
+{{-      if IsInt $a -}}{{- . -}}
+{{-      else        -}}{{- template "Type" $a -}}
+{{-      end -}}
+{{-    end -}}
+>
+{{-   end -}}
+{{- end -}}
diff --git a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl b/test/tint/builtins/gen/insertBits/3c7ba5.wgsl
deleted file mode 100644
index 8816fa4..0000000
--- a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(vec<2, u32>, vec<2, u32>, u32, u32) -> vec<2, u32>
-fn insertBits_3c7ba5() {
-  var res: vec2<u32> = insertBits(vec2<u32>(), vec2<u32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_3c7ba5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_3c7ba5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_3c7ba5();
-}
diff --git a/test/tint/builtins/gen/insertBits/428b0b.wgsl b/test/tint/builtins/gen/insertBits/428b0b.wgsl
deleted file mode 100644
index 8fafe77..0000000
--- a/test/tint/builtins/gen/insertBits/428b0b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(vec<3, i32>, vec<3, i32>, u32, u32) -> vec<3, i32>
-fn insertBits_428b0b() {
-  var res: vec3<i32> = insertBits(vec3<i32>(), vec3<i32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_428b0b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_428b0b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_428b0b();
-}
diff --git a/test/tint/builtins/gen/insertBits/51ede1.wgsl b/test/tint/builtins/gen/insertBits/51ede1.wgsl
deleted file mode 100644
index e21ce9b..0000000
--- a/test/tint/builtins/gen/insertBits/51ede1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(vec<4, u32>, vec<4, u32>, u32, u32) -> vec<4, u32>
-fn insertBits_51ede1() {
-  var res: vec4<u32> = insertBits(vec4<u32>(), vec4<u32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_51ede1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_51ede1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_51ede1();
-}
diff --git a/test/tint/builtins/gen/insertBits/65468b.wgsl b/test/tint/builtins/gen/insertBits/65468b.wgsl
deleted file mode 100644
index 45fe4f94..0000000
--- a/test/tint/builtins/gen/insertBits/65468b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(i32, i32, u32, u32) -> i32
-fn insertBits_65468b() {
-  var res: i32 = insertBits(1, 1, 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_65468b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_65468b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_65468b();
-}
diff --git a/test/tint/builtins/gen/insertBits/87826b.wgsl b/test/tint/builtins/gen/insertBits/87826b.wgsl
deleted file mode 100644
index 66bbaeb..0000000
--- a/test/tint/builtins/gen/insertBits/87826b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(vec<3, u32>, vec<3, u32>, u32, u32) -> vec<3, u32>
-fn insertBits_87826b() {
-  var res: vec3<u32> = insertBits(vec3<u32>(), vec3<u32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_87826b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_87826b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_87826b();
-}
diff --git a/test/tint/builtins/gen/insertBits/d86978.wgsl b/test/tint/builtins/gen/insertBits/d86978.wgsl
deleted file mode 100644
index 3de7263..0000000
--- a/test/tint/builtins/gen/insertBits/d86978.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(vec<4, i32>, vec<4, i32>, u32, u32) -> vec<4, i32>
-fn insertBits_d86978() {
-  var res: vec4<i32> = insertBits(vec4<i32>(), vec4<i32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_d86978();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_d86978();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_d86978();
-}
diff --git a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl b/test/tint/builtins/gen/insertBits/e3e3a2.wgsl
deleted file mode 100644
index 2a43d7e..0000000
--- a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(u32, u32, u32, u32) -> u32
-fn insertBits_e3e3a2() {
-  var res: u32 = insertBits(1u, 1u, 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_e3e3a2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_e3e3a2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_e3e3a2();
-}
diff --git a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl b/test/tint/builtins/gen/insertBits/fe6ba6.wgsl
deleted file mode 100644
index 550a239..0000000
--- a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn insertBits(vec<2, i32>, vec<2, i32>, u32, u32) -> vec<2, i32>
-fn insertBits_fe6ba6() {
-  var res: vec2<i32> = insertBits(vec2<i32>(), vec2<i32>(), 1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  insertBits_fe6ba6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  insertBits_fe6ba6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  insertBits_fe6ba6();
-}
diff --git a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl b/test/tint/builtins/gen/inverseSqrt/84407e.wgsl
deleted file mode 100644
index 42711df..0000000
--- a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn inverseSqrt(f32) -> f32
-fn inverseSqrt_84407e() {
-  var res: f32 = inverseSqrt(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  inverseSqrt_84407e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  inverseSqrt_84407e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  inverseSqrt_84407e();
-}
diff --git a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl b/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl
deleted file mode 100644
index 3e2c581..0000000
--- a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn inverseSqrt(vec<2, f32>) -> vec<2, f32>
-fn inverseSqrt_8f2bd2() {
-  var res: vec2<f32> = inverseSqrt(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  inverseSqrt_8f2bd2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  inverseSqrt_8f2bd2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  inverseSqrt_8f2bd2();
-}
diff --git a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl b/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl
deleted file mode 100644
index 9edad1b..0000000
--- a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn inverseSqrt(vec<3, f32>) -> vec<3, f32>
-fn inverseSqrt_b197b1() {
-  var res: vec3<f32> = inverseSqrt(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  inverseSqrt_b197b1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  inverseSqrt_b197b1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  inverseSqrt_b197b1();
-}
diff --git a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl b/test/tint/builtins/gen/inverseSqrt/c22347.wgsl
deleted file mode 100644
index a0394fb..0000000
--- a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn inverseSqrt(vec<4, f32>) -> vec<4, f32>
-fn inverseSqrt_c22347() {
-  var res: vec4<f32> = inverseSqrt(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  inverseSqrt_c22347();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  inverseSqrt_c22347();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  inverseSqrt_c22347();
-}
diff --git a/test/tint/builtins/gen/ldexp/a31cdc.wgsl b/test/tint/builtins/gen/ldexp/a31cdc.wgsl
deleted file mode 100644
index 1a0c392..0000000
--- a/test/tint/builtins/gen/ldexp/a31cdc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ldexp(vec<3, f32>, vec<3, i32>) -> vec<3, f32>
-fn ldexp_a31cdc() {
-  var res: vec3<f32> = ldexp(vec3<f32>(), vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ldexp_a31cdc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ldexp_a31cdc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ldexp_a31cdc();
-}
diff --git a/test/tint/builtins/gen/ldexp/abd718.wgsl b/test/tint/builtins/gen/ldexp/abd718.wgsl
deleted file mode 100644
index ffa468a..0000000
--- a/test/tint/builtins/gen/ldexp/abd718.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ldexp(vec<2, f32>, vec<2, i32>) -> vec<2, f32>
-fn ldexp_abd718() {
-  var res: vec2<f32> = ldexp(vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ldexp_abd718();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ldexp_abd718();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ldexp_abd718();
-}
diff --git a/test/tint/builtins/gen/ldexp/cc9cde.wgsl b/test/tint/builtins/gen/ldexp/cc9cde.wgsl
deleted file mode 100644
index f2774fd..0000000
--- a/test/tint/builtins/gen/ldexp/cc9cde.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ldexp(vec<4, f32>, vec<4, i32>) -> vec<4, f32>
-fn ldexp_cc9cde() {
-  var res: vec4<f32> = ldexp(vec4<f32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ldexp_cc9cde();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ldexp_cc9cde();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ldexp_cc9cde();
-}
diff --git a/test/tint/builtins/gen/ldexp/db8b49.wgsl b/test/tint/builtins/gen/ldexp/db8b49.wgsl
deleted file mode 100644
index aad5fdc..0000000
--- a/test/tint/builtins/gen/ldexp/db8b49.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn ldexp(f32, i32) -> f32
-fn ldexp_db8b49() {
-  var res: f32 = ldexp(1.0, 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  ldexp_db8b49();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  ldexp_db8b49();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  ldexp_db8b49();
-}
diff --git a/test/tint/builtins/gen/length/056071.wgsl b/test/tint/builtins/gen/length/056071.wgsl
deleted file mode 100644
index 34bc10d..0000000
--- a/test/tint/builtins/gen/length/056071.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn length(vec<3, f32>) -> f32
-fn length_056071() {
-  var res: f32 = length(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  length_056071();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  length_056071();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  length_056071();
-}
diff --git a/test/tint/builtins/gen/length/602a17.wgsl b/test/tint/builtins/gen/length/602a17.wgsl
deleted file mode 100644
index a2f82a6..0000000
--- a/test/tint/builtins/gen/length/602a17.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn length(f32) -> f32
-fn length_602a17() {
-  var res: f32 = length(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  length_602a17();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  length_602a17();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  length_602a17();
-}
diff --git a/test/tint/builtins/gen/length/afde8b.wgsl b/test/tint/builtins/gen/length/afde8b.wgsl
deleted file mode 100644
index 4f4ec0b..0000000
--- a/test/tint/builtins/gen/length/afde8b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn length(vec<2, f32>) -> f32
-fn length_afde8b() {
-  var res: f32 = length(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  length_afde8b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  length_afde8b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  length_afde8b();
-}
diff --git a/test/tint/builtins/gen/length/becebf.wgsl b/test/tint/builtins/gen/length/becebf.wgsl
deleted file mode 100644
index ea48945..0000000
--- a/test/tint/builtins/gen/length/becebf.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn length(vec<4, f32>) -> f32
-fn length_becebf() {
-  var res: f32 = length(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  length_becebf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  length_becebf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  length_becebf();
-}
diff --git a/test/tint/builtins/gen/literal/abs/002533.wgsl b/test/tint/builtins/gen/literal/abs/002533.wgsl
new file mode 100644
index 0000000..629d145
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/002533.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<4, f32>) -> vec<4, f32>
+fn abs_002533() {
+  var res: vec4<f32> = abs(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_002533();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_002533();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_002533();
+}
diff --git a/test/tint/builtins/gen/abs/002533.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/002533.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/002533.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/002533.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/002533.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/002533.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/002533.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/002533.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/002533.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/002533.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/002533.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/002533.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/002533.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/002533.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/002533.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/002533.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/002533.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/002533.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/002533.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/002533.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/005174.wgsl b/test/tint/builtins/gen/literal/abs/005174.wgsl
new file mode 100644
index 0000000..b22b60d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/005174.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<3, f32>) -> vec<3, f32>
+fn abs_005174() {
+  var res: vec3<f32> = abs(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_005174();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_005174();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_005174();
+}
diff --git a/test/tint/builtins/gen/abs/005174.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/005174.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/005174.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/005174.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/005174.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/005174.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/005174.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/005174.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/005174.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/005174.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/005174.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/005174.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/005174.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/005174.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/005174.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/005174.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/005174.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/005174.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/005174.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/005174.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/1ce782.wgsl b/test/tint/builtins/gen/literal/abs/1ce782.wgsl
new file mode 100644
index 0000000..7487129
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/1ce782.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<4, u32>) -> vec<4, u32>
+fn abs_1ce782() {
+  var res: vec4<u32> = abs(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_1ce782();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_1ce782();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_1ce782();
+}
diff --git a/test/tint/builtins/gen/abs/1ce782.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/1ce782.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/1ce782.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/1ce782.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/1ce782.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/1ce782.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/1ce782.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/1ce782.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/1ce782.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/1ce782.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/1ce782.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/1e9d53.wgsl b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl
new file mode 100644
index 0000000..0a43ebc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<2, f32>) -> vec<2, f32>
+fn abs_1e9d53() {
+  var res: vec2<f32> = abs(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_1e9d53();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_1e9d53();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_1e9d53();
+}
diff --git a/test/tint/builtins/gen/abs/1e9d53.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/1e9d53.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/1e9d53.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/1e9d53.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/1e9d53.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/1e9d53.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/1e9d53.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/1e9d53.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/1e9d53.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/1e9d53.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/1e9d53.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/467cd1.wgsl b/test/tint/builtins/gen/literal/abs/467cd1.wgsl
new file mode 100644
index 0000000..f56c0e7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/467cd1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(u32) -> u32
+fn abs_467cd1() {
+  var res: u32 = abs(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_467cd1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_467cd1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_467cd1();
+}
diff --git a/test/tint/builtins/gen/abs/467cd1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/467cd1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/467cd1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/467cd1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/467cd1.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/467cd1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/467cd1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/467cd1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/467cd1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/467cd1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/467cd1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/4ad288.wgsl b/test/tint/builtins/gen/literal/abs/4ad288.wgsl
new file mode 100644
index 0000000..ac0a540
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/4ad288.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(i32) -> i32
+fn abs_4ad288() {
+  var res: i32 = abs(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_4ad288();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_4ad288();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_4ad288();
+}
diff --git a/test/tint/builtins/gen/abs/4ad288.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/4ad288.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/4ad288.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/4ad288.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/4ad288.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/4ad288.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/4ad288.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/4ad288.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/4ad288.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/4ad288.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/4ad288.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/5ad50a.wgsl b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl
new file mode 100644
index 0000000..b31a2d7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<3, i32>) -> vec<3, i32>
+fn abs_5ad50a() {
+  var res: vec3<i32> = abs(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_5ad50a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_5ad50a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_5ad50a();
+}
diff --git a/test/tint/builtins/gen/abs/5ad50a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/5ad50a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/5ad50a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/5ad50a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/5ad50a.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/5ad50a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/5ad50a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/5ad50a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/5ad50a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/5ad50a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/5ad50a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/7326de.wgsl b/test/tint/builtins/gen/literal/abs/7326de.wgsl
new file mode 100644
index 0000000..2341b40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/7326de.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<3, u32>) -> vec<3, u32>
+fn abs_7326de() {
+  var res: vec3<u32> = abs(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_7326de();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_7326de();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_7326de();
+}
diff --git a/test/tint/builtins/gen/abs/7326de.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7326de.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/7326de.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7326de.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/7326de.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/7326de.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/7326de.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/7326de.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/7326de.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7326de.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/7326de.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/7f28e6.wgsl b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl
new file mode 100644
index 0000000..140a4a8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<2, u32>) -> vec<2, u32>
+fn abs_7f28e6() {
+  var res: vec2<u32> = abs(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_7f28e6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_7f28e6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_7f28e6();
+}
diff --git a/test/tint/builtins/gen/abs/7f28e6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7f28e6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/7f28e6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7f28e6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/7f28e6.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/7f28e6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/7f28e6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/7f28e6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/7f28e6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7f28e6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/7f28e6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/7faa9e.wgsl b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl
new file mode 100644
index 0000000..23011a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<2, i32>) -> vec<2, i32>
+fn abs_7faa9e() {
+  var res: vec2<i32> = abs(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_7faa9e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_7faa9e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_7faa9e();
+}
diff --git a/test/tint/builtins/gen/abs/7faa9e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7faa9e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/7faa9e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7faa9e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/7faa9e.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/7faa9e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/7faa9e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/7faa9e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/7faa9e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/7faa9e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/7faa9e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/9c80a6.wgsl b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl
new file mode 100644
index 0000000..1fba92e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(vec<4, i32>) -> vec<4, i32>
+fn abs_9c80a6() {
+  var res: vec4<i32> = abs(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_9c80a6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_9c80a6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_9c80a6();
+}
diff --git a/test/tint/builtins/gen/abs/9c80a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/9c80a6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/9c80a6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/9c80a6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/9c80a6.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/9c80a6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/9c80a6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/9c80a6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/9c80a6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/9c80a6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/9c80a6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/abs/b96037.wgsl b/test/tint/builtins/gen/literal/abs/b96037.wgsl
new file mode 100644
index 0000000..603d341
--- /dev/null
+++ b/test/tint/builtins/gen/literal/abs/b96037.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn abs(f32) -> f32
+fn abs_b96037() {
+  var res: f32 = abs(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  abs_b96037();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  abs_b96037();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  abs_b96037();
+}
diff --git a/test/tint/builtins/gen/abs/b96037.wgsl.expected.glsl b/test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/abs/b96037.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/abs/b96037.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/abs/b96037.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/abs/b96037.wgsl.expected.msl b/test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/abs/b96037.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/abs/b96037.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/abs/b96037.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/abs/b96037.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/abs/b96037.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/abs/b96037.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/acos/489247.wgsl b/test/tint/builtins/gen/literal/acos/489247.wgsl
new file mode 100644
index 0000000..0bdc1bf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/acos/489247.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn acos(f32) -> f32
+fn acos_489247() {
+  var res: f32 = acos(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  acos_489247();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  acos_489247();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  acos_489247();
+}
diff --git a/test/tint/builtins/gen/acos/489247.wgsl.expected.glsl b/test/tint/builtins/gen/literal/acos/489247.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/acos/489247.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/acos/489247.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/acos/489247.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/acos/489247.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/acos/489247.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/acos/489247.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/acos/489247.wgsl.expected.msl b/test/tint/builtins/gen/literal/acos/489247.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/acos/489247.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/acos/489247.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/acos/489247.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/acos/489247.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/acos/489247.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/acos/489247.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/acos/489247.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/acos/489247.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/acos/489247.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/acos/489247.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/acos/8e2acf.wgsl b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl
new file mode 100644
index 0000000..6371bc9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn acos(vec<4, f32>) -> vec<4, f32>
+fn acos_8e2acf() {
+  var res: vec4<f32> = acos(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  acos_8e2acf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  acos_8e2acf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  acos_8e2acf();
+}
diff --git a/test/tint/builtins/gen/acos/8e2acf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/acos/8e2acf.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/acos/8e2acf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/acos/8e2acf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/acos/8e2acf.wgsl.expected.msl b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/acos/8e2acf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/acos/8e2acf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/acos/8e2acf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/acos/8e2acf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/acos/8e2acf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/acos/8e2acf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/acos/a610c4.wgsl b/test/tint/builtins/gen/literal/acos/a610c4.wgsl
new file mode 100644
index 0000000..1d8c7f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/acos/a610c4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn acos(vec<3, f32>) -> vec<3, f32>
+fn acos_a610c4() {
+  var res: vec3<f32> = acos(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  acos_a610c4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  acos_a610c4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  acos_a610c4();
+}
diff --git a/test/tint/builtins/gen/acos/a610c4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/acos/a610c4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/acos/a610c4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/acos/a610c4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/acos/a610c4.wgsl.expected.msl b/test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/acos/a610c4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/acos/a610c4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/acos/a610c4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/acos/a610c4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/acos/a610c4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/acos/a610c4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/acos/dfc915.wgsl b/test/tint/builtins/gen/literal/acos/dfc915.wgsl
new file mode 100644
index 0000000..b8d95bd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/acos/dfc915.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn acos(vec<2, f32>) -> vec<2, f32>
+fn acos_dfc915() {
+  var res: vec2<f32> = acos(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  acos_dfc915();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  acos_dfc915();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  acos_dfc915();
+}
diff --git a/test/tint/builtins/gen/acos/dfc915.wgsl.expected.glsl b/test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/acos/dfc915.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/acos/dfc915.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/acos/dfc915.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/acos/dfc915.wgsl.expected.msl b/test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/acos/dfc915.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/acos/dfc915.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/acos/dfc915.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/acos/dfc915.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/acos/dfc915.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/acos/dfc915.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/all/353d6a.wgsl b/test/tint/builtins/gen/literal/all/353d6a.wgsl
new file mode 100644
index 0000000..2709c44
--- /dev/null
+++ b/test/tint/builtins/gen/literal/all/353d6a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn all(bool) -> bool
+fn all_353d6a() {
+  var res: bool = all(bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  all_353d6a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  all_353d6a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  all_353d6a();
+}
diff --git a/test/tint/builtins/gen/all/353d6a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/all/353d6a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/all/353d6a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/all/353d6a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/all/353d6a.wgsl.expected.msl b/test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/all/353d6a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/all/353d6a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/all/353d6a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/all/353d6a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/all/353d6a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/all/353d6a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/all/986c7b.wgsl b/test/tint/builtins/gen/literal/all/986c7b.wgsl
new file mode 100644
index 0000000..92714f7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/all/986c7b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn all(vec<4, bool>) -> bool
+fn all_986c7b() {
+  var res: bool = all(vec4<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  all_986c7b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  all_986c7b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  all_986c7b();
+}
diff --git a/test/tint/builtins/gen/all/986c7b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/all/986c7b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/all/986c7b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/all/986c7b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/all/986c7b.wgsl.expected.msl b/test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/all/986c7b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/all/986c7b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/all/986c7b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/all/986c7b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/all/986c7b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/all/986c7b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/all/bd2dba.wgsl b/test/tint/builtins/gen/literal/all/bd2dba.wgsl
new file mode 100644
index 0000000..e28d07b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/all/bd2dba.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn all(vec<3, bool>) -> bool
+fn all_bd2dba() {
+  var res: bool = all(vec3<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  all_bd2dba();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  all_bd2dba();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  all_bd2dba();
+}
diff --git a/test/tint/builtins/gen/all/bd2dba.wgsl.expected.glsl b/test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/all/bd2dba.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/all/bd2dba.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/all/bd2dba.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/all/bd2dba.wgsl.expected.msl b/test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/all/bd2dba.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/all/bd2dba.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/all/bd2dba.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/all/bd2dba.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/all/bd2dba.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/all/bd2dba.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/all/f46790.wgsl b/test/tint/builtins/gen/literal/all/f46790.wgsl
new file mode 100644
index 0000000..cef2ae2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/all/f46790.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn all(vec<2, bool>) -> bool
+fn all_f46790() {
+  var res: bool = all(vec2<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  all_f46790();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  all_f46790();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  all_f46790();
+}
diff --git a/test/tint/builtins/gen/all/f46790.wgsl.expected.glsl b/test/tint/builtins/gen/literal/all/f46790.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/all/f46790.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/all/f46790.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/all/f46790.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/all/f46790.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/all/f46790.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/all/f46790.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/all/f46790.wgsl.expected.msl b/test/tint/builtins/gen/literal/all/f46790.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/all/f46790.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/all/f46790.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/all/f46790.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/all/f46790.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/all/f46790.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/all/f46790.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/all/f46790.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/all/f46790.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/all/f46790.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/all/f46790.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/any/083428.wgsl b/test/tint/builtins/gen/literal/any/083428.wgsl
new file mode 100644
index 0000000..0d7f1b3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/any/083428.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn any(vec<4, bool>) -> bool
+fn any_083428() {
+  var res: bool = any(vec4<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  any_083428();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  any_083428();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  any_083428();
+}
diff --git a/test/tint/builtins/gen/any/083428.wgsl.expected.glsl b/test/tint/builtins/gen/literal/any/083428.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/any/083428.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/any/083428.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/any/083428.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/any/083428.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/any/083428.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/any/083428.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/any/083428.wgsl.expected.msl b/test/tint/builtins/gen/literal/any/083428.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/any/083428.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/any/083428.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/any/083428.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/any/083428.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/any/083428.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/any/083428.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/any/083428.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/any/083428.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/any/083428.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/any/083428.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/any/0e3e58.wgsl b/test/tint/builtins/gen/literal/any/0e3e58.wgsl
new file mode 100644
index 0000000..c71e30b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/any/0e3e58.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn any(vec<2, bool>) -> bool
+fn any_0e3e58() {
+  var res: bool = any(vec2<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  any_0e3e58();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  any_0e3e58();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  any_0e3e58();
+}
diff --git a/test/tint/builtins/gen/any/0e3e58.wgsl.expected.glsl b/test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/any/0e3e58.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/any/0e3e58.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/any/0e3e58.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/any/0e3e58.wgsl.expected.msl b/test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/any/0e3e58.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/any/0e3e58.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/any/0e3e58.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/any/0e3e58.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/any/0e3e58.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/any/0e3e58.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/any/2ab91a.wgsl b/test/tint/builtins/gen/literal/any/2ab91a.wgsl
new file mode 100644
index 0000000..819c692
--- /dev/null
+++ b/test/tint/builtins/gen/literal/any/2ab91a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn any(bool) -> bool
+fn any_2ab91a() {
+  var res: bool = any(bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  any_2ab91a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  any_2ab91a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  any_2ab91a();
+}
diff --git a/test/tint/builtins/gen/any/2ab91a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/any/2ab91a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/any/2ab91a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/any/2ab91a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/any/2ab91a.wgsl.expected.msl b/test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/any/2ab91a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/any/2ab91a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/any/2ab91a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/any/2ab91a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/any/2ab91a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/any/2ab91a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/any/e755c1.wgsl b/test/tint/builtins/gen/literal/any/e755c1.wgsl
new file mode 100644
index 0000000..39e9415
--- /dev/null
+++ b/test/tint/builtins/gen/literal/any/e755c1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn any(vec<3, bool>) -> bool
+fn any_e755c1() {
+  var res: bool = any(vec3<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  any_e755c1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  any_e755c1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  any_e755c1();
+}
diff --git a/test/tint/builtins/gen/any/e755c1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/any/e755c1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/any/e755c1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/any/e755c1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/any/e755c1.wgsl.expected.msl b/test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/any/e755c1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/any/e755c1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/any/e755c1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/any/e755c1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/any/e755c1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/any/e755c1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl
new file mode 100644
index 0000000..c4dec13
--- /dev/null
+++ b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl
@@ -0,0 +1,49 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RO {
+  arg_0: array<i32>,
+};
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
+
+// fn arrayLength(ptr<storage, array<i32>, read>) -> u32
+fn arrayLength_1588cd() {
+  var res: u32 = arrayLength(&sb_ro.arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  arrayLength_1588cd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  arrayLength_1588cd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  arrayLength_1588cd();
+}
diff --git a/test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/1588cd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl
new file mode 100644
index 0000000..a7adcc1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl
@@ -0,0 +1,49 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: array<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn arrayLength(ptr<storage, array<i32>, read_write>) -> u32
+fn arrayLength_61b1c7() {
+  var res: u32 = arrayLength(&sb_rw.arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  arrayLength_61b1c7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  arrayLength_61b1c7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  arrayLength_61b1c7();
+}
diff --git a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/61b1c7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl
new file mode 100644
index 0000000..3f83858
--- /dev/null
+++ b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl
@@ -0,0 +1,49 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RO {
+  arg_0: array<f32>,
+};
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
+
+// fn arrayLength(ptr<storage, array<f32>, read>) -> u32
+fn arrayLength_a0f5ca() {
+  var res: u32 = arrayLength(&sb_ro.arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  arrayLength_a0f5ca();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  arrayLength_a0f5ca();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  arrayLength_a0f5ca();
+}
diff --git a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/a0f5ca.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl
new file mode 100644
index 0000000..3b38e51
--- /dev/null
+++ b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl
@@ -0,0 +1,49 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: array<f32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn arrayLength(ptr<storage, array<f32>, read_write>) -> u32
+fn arrayLength_cdd123() {
+  var res: u32 = arrayLength(&sb_rw.arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  arrayLength_cdd123();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  arrayLength_cdd123();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  arrayLength_cdd123();
+}
diff --git a/test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cdd123.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl
new file mode 100644
index 0000000..99d788d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl
@@ -0,0 +1,49 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RO {
+  arg_0: array<u32>,
+};
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
+
+// fn arrayLength(ptr<storage, array<u32>, read>) -> u32
+fn arrayLength_cfca0a() {
+  var res: u32 = arrayLength(&sb_ro.arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  arrayLength_cfca0a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  arrayLength_cfca0a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  arrayLength_cfca0a();
+}
diff --git a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/cfca0a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl
new file mode 100644
index 0000000..cc2627b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl
@@ -0,0 +1,49 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: array<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn arrayLength(ptr<storage, array<u32>, read_write>) -> u32
+fn arrayLength_eb510f() {
+  var res: u32 = arrayLength(&sb_rw.arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  arrayLength_eb510f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  arrayLength_eb510f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  arrayLength_eb510f();
+}
diff --git a/test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.msl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/arrayLength/eb510f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/asin/064953.wgsl b/test/tint/builtins/gen/literal/asin/064953.wgsl
new file mode 100644
index 0000000..0d11d1d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/asin/064953.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn asin(vec<4, f32>) -> vec<4, f32>
+fn asin_064953() {
+  var res: vec4<f32> = asin(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  asin_064953();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  asin_064953();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  asin_064953();
+}
diff --git a/test/tint/builtins/gen/asin/064953.wgsl.expected.glsl b/test/tint/builtins/gen/literal/asin/064953.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/asin/064953.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/asin/064953.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/asin/064953.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/asin/064953.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/asin/064953.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/asin/064953.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/asin/064953.wgsl.expected.msl b/test/tint/builtins/gen/literal/asin/064953.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/asin/064953.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/asin/064953.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/asin/064953.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/asin/064953.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/asin/064953.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/asin/064953.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/asin/064953.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/asin/064953.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/asin/064953.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/asin/064953.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/asin/7b6a44.wgsl b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl
new file mode 100644
index 0000000..d51fc3f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn asin(vec<2, f32>) -> vec<2, f32>
+fn asin_7b6a44() {
+  var res: vec2<f32> = asin(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  asin_7b6a44();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  asin_7b6a44();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  asin_7b6a44();
+}
diff --git a/test/tint/builtins/gen/asin/7b6a44.wgsl.expected.glsl b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/asin/7b6a44.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/asin/7b6a44.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/asin/7b6a44.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/asin/7b6a44.wgsl.expected.msl b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/asin/7b6a44.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/asin/7b6a44.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/asin/7b6a44.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/asin/7b6a44.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/asin/7b6a44.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/asin/7b6a44.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl
new file mode 100644
index 0000000..0fec623
--- /dev/null
+++ b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn asin(vec<3, f32>) -> vec<3, f32>
+fn asin_8cd9c9() {
+  var res: vec3<f32> = asin(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  asin_8cd9c9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  asin_8cd9c9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  asin_8cd9c9();
+}
diff --git a/test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.msl b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/asin/8cd9c9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/asin/8cd9c9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/asin/c0c272.wgsl b/test/tint/builtins/gen/literal/asin/c0c272.wgsl
new file mode 100644
index 0000000..1557428
--- /dev/null
+++ b/test/tint/builtins/gen/literal/asin/c0c272.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn asin(f32) -> f32
+fn asin_c0c272() {
+  var res: f32 = asin(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  asin_c0c272();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  asin_c0c272();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  asin_c0c272();
+}
diff --git a/test/tint/builtins/gen/asin/c0c272.wgsl.expected.glsl b/test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/asin/c0c272.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/asin/c0c272.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/asin/c0c272.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/asin/c0c272.wgsl.expected.msl b/test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/asin/c0c272.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/asin/c0c272.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/asin/c0c272.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/asin/c0c272.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/asin/c0c272.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/asin/c0c272.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan/02979a.wgsl b/test/tint/builtins/gen/literal/atan/02979a.wgsl
new file mode 100644
index 0000000..11619cc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan/02979a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan(f32) -> f32
+fn atan_02979a() {
+  var res: f32 = atan(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan_02979a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan_02979a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan_02979a();
+}
diff --git a/test/tint/builtins/gen/atan/02979a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan/02979a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan/02979a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan/02979a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan/02979a.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan/02979a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan/02979a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan/02979a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan/02979a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan/02979a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan/02979a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan/331e6d.wgsl b/test/tint/builtins/gen/literal/atan/331e6d.wgsl
new file mode 100644
index 0000000..d3bac2d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan/331e6d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan(vec<3, f32>) -> vec<3, f32>
+fn atan_331e6d() {
+  var res: vec3<f32> = atan(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan_331e6d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan_331e6d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan_331e6d();
+}
diff --git a/test/tint/builtins/gen/atan/331e6d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan/331e6d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan/331e6d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan/331e6d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan/331e6d.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan/331e6d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan/331e6d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan/331e6d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan/331e6d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan/331e6d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan/331e6d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan/a8b696.wgsl b/test/tint/builtins/gen/literal/atan/a8b696.wgsl
new file mode 100644
index 0000000..e517917
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan/a8b696.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan(vec<4, f32>) -> vec<4, f32>
+fn atan_a8b696() {
+  var res: vec4<f32> = atan(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan_a8b696();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan_a8b696();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan_a8b696();
+}
diff --git a/test/tint/builtins/gen/atan/a8b696.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan/a8b696.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan/a8b696.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan/a8b696.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan/a8b696.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan/a8b696.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan/a8b696.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan/a8b696.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan/a8b696.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan/a8b696.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan/a8b696.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan/ad96e4.wgsl b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl
new file mode 100644
index 0000000..75a7564
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan(vec<2, f32>) -> vec<2, f32>
+fn atan_ad96e4() {
+  var res: vec2<f32> = atan(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan_ad96e4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan_ad96e4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan_ad96e4();
+}
diff --git a/test/tint/builtins/gen/atan/ad96e4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan/ad96e4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan/ad96e4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan/ad96e4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan/ad96e4.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan/ad96e4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan/ad96e4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan/ad96e4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan/ad96e4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan/ad96e4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan/ad96e4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan2/57fb13.wgsl b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl
new file mode 100644
index 0000000..e1d1967
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan2(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn atan2_57fb13() {
+  var res: vec2<f32> = atan2(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan2_57fb13();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan2_57fb13();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan2_57fb13();
+}
diff --git a/test/tint/builtins/gen/atan2/57fb13.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/57fb13.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan2/57fb13.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/57fb13.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan2/57fb13.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan2/57fb13.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan2/57fb13.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan2/57fb13.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan2/57fb13.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/57fb13.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan2/57fb13.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan2/96057c.wgsl b/test/tint/builtins/gen/literal/atan2/96057c.wgsl
new file mode 100644
index 0000000..d4c2769
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan2/96057c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan2(f32, f32) -> f32
+fn atan2_96057c() {
+  var res: f32 = atan2(1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan2_96057c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan2_96057c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan2_96057c();
+}
diff --git a/test/tint/builtins/gen/atan2/96057c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/96057c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan2/96057c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/96057c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan2/96057c.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan2/96057c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan2/96057c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan2/96057c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan2/96057c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/96057c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan2/96057c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl
new file mode 100644
index 0000000..7341157
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan2(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn atan2_a70d0d() {
+  var res: vec3<f32> = atan2(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan2_a70d0d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan2_a70d0d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan2_a70d0d();
+}
diff --git a/test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/a70d0d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan2/a70d0d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atan2/ae713e.wgsl b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl
new file mode 100644
index 0000000..3b02156
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn atan2(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn atan2_ae713e() {
+  var res: vec4<f32> = atan2(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  atan2_ae713e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atan2_ae713e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atan2_ae713e();
+}
diff --git a/test/tint/builtins/gen/atan2/ae713e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/ae713e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atan2/ae713e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/ae713e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atan2/ae713e.wgsl.expected.msl b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atan2/ae713e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atan2/ae713e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atan2/ae713e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atan2/ae713e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atan2/ae713e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atan2/ae713e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl
new file mode 100644
index 0000000..56d9338
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicAdd(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicAdd_794055() {
+  var res: i32 = atomicAdd(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAdd_794055();
+}
diff --git a/test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/794055.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAdd/794055.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl
new file mode 100644
index 0000000..91e2298
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicAdd(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicAdd_8a199a() {
+  var res: u32 = atomicAdd(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicAdd_8a199a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAdd_8a199a();
+}
diff --git a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/8a199a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl
new file mode 100644
index 0000000..8bbef8b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicAdd(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicAdd_d32fe4() {
+  var res: i32 = atomicAdd(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicAdd_d32fe4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAdd_d32fe4();
+}
diff --git a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d32fe4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl
new file mode 100644
index 0000000..b5e30f2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicAdd(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicAdd_d5db1d() {
+  var res: u32 = atomicAdd(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAdd_d5db1d();
+}
diff --git a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAdd/d5db1d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAdd/d5db1d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl
new file mode 100644
index 0000000..4409003
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicAnd(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicAnd_152966() {
+  var res: i32 = atomicAnd(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicAnd_152966();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAnd_152966();
+}
diff --git a/test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/152966.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl
new file mode 100644
index 0000000..4029423
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicAnd(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicAnd_34edd3() {
+  var res: u32 = atomicAnd(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAnd_34edd3();
+}
diff --git a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/34edd3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAnd/34edd3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl
new file mode 100644
index 0000000..b47df1c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicAnd(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicAnd_45a819() {
+  var res: i32 = atomicAnd(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAnd_45a819();
+}
diff --git a/test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/45a819.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAnd/45a819.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl
new file mode 100644
index 0000000..2948f9a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicAnd(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicAnd_85a8d9() {
+  var res: u32 = atomicAnd(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicAnd_85a8d9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicAnd_85a8d9();
+}
diff --git a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicAnd/85a8d9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl
new file mode 100644
index 0000000..7732bd9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicCompareExchangeWeak(ptr<storage, atomic<i32>, read_write>, i32, i32) -> __atomic_compare_exchange_result<i32>
+fn atomicCompareExchangeWeak_1bd40a() {
+  var res = atomicCompareExchangeWeak(&sb_rw.arg_0, 1, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicCompareExchangeWeak_1bd40a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicCompareExchangeWeak_1bd40a();
+}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/1bd40a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl
new file mode 100644
index 0000000..61972dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicCompareExchangeWeak(ptr<storage, atomic<u32>, read_write>, u32, u32) -> __atomic_compare_exchange_result<u32>
+fn atomicCompareExchangeWeak_63d8e6() {
+  var res = atomicCompareExchangeWeak(&sb_rw.arg_0, 1u, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicCompareExchangeWeak_63d8e6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicCompareExchangeWeak_63d8e6();
+}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/63d8e6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl
new file mode 100644
index 0000000..9545b42
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicCompareExchangeWeak(ptr<workgroup, atomic<u32>, read_write>, u32, u32) -> __atomic_compare_exchange_result<u32>
+fn atomicCompareExchangeWeak_83580d() {
+  var res = atomicCompareExchangeWeak(&arg_0, 1u, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicCompareExchangeWeak_83580d();
+}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/83580d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/83580d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl
new file mode 100644
index 0000000..03076c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicCompareExchangeWeak(ptr<workgroup, atomic<i32>, read_write>, i32, i32) -> __atomic_compare_exchange_result<i32>
+fn atomicCompareExchangeWeak_e88938() {
+  var res = atomicCompareExchangeWeak(&arg_0, 1, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicCompareExchangeWeak_e88938();
+}
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicCompareExchangeWeak/e88938.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicCompareExchangeWeak/e88938.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl
new file mode 100644
index 0000000..eea1d0f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicExchange(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicExchange_0a5dca() {
+  var res: u32 = atomicExchange(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicExchange_0a5dca();
+}
diff --git a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/0a5dca.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicExchange/0a5dca.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl
new file mode 100644
index 0000000..e47ed14
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicExchange(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicExchange_d59712() {
+  var res: u32 = atomicExchange(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicExchange_d59712();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicExchange_d59712();
+}
diff --git a/test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/d59712.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl
new file mode 100644
index 0000000..541c188
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicExchange(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicExchange_e114ba() {
+  var res: i32 = atomicExchange(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicExchange_e114ba();
+}
diff --git a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/e114ba.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicExchange/e114ba.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl
new file mode 100644
index 0000000..5832659
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicExchange(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicExchange_f2e22f() {
+  var res: i32 = atomicExchange(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicExchange_f2e22f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicExchange_f2e22f();
+}
diff --git a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicExchange/f2e22f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl
new file mode 100644
index 0000000..e20d830
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicLoad(ptr<storage, atomic<i32>, read_write>) -> i32
+fn atomicLoad_0806ad() {
+  var res: i32 = atomicLoad(&sb_rw.arg_0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicLoad_0806ad();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicLoad_0806ad();
+}
diff --git a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/0806ad.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl
new file mode 100644
index 0000000..e0cc43f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicLoad(ptr<workgroup, atomic<u32>, read_write>) -> u32
+fn atomicLoad_361bf1() {
+  var res: u32 = atomicLoad(&arg_0);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicLoad_361bf1();
+}
diff --git a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/361bf1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicLoad/361bf1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl
new file mode 100644
index 0000000..025384f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicLoad(ptr<workgroup, atomic<i32>, read_write>) -> i32
+fn atomicLoad_afcc03() {
+  var res: i32 = atomicLoad(&arg_0);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicLoad_afcc03();
+}
diff --git a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/afcc03.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicLoad/afcc03.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl
new file mode 100644
index 0000000..63b1594
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicLoad(ptr<storage, atomic<u32>, read_write>) -> u32
+fn atomicLoad_fe6cc3() {
+  var res: u32 = atomicLoad(&sb_rw.arg_0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicLoad_fe6cc3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicLoad_fe6cc3();
+}
diff --git a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicLoad/fe6cc3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl
new file mode 100644
index 0000000..f83327c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicMax(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicMax_51b9be() {
+  var res: u32 = atomicMax(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicMax_51b9be();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMax_51b9be();
+}
diff --git a/test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/51b9be.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl
new file mode 100644
index 0000000..29f0e77
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicMax(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicMax_92aa72() {
+  var res: i32 = atomicMax(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicMax_92aa72();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMax_92aa72();
+}
diff --git a/test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/92aa72.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl
new file mode 100644
index 0000000..c008f25
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicMax(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicMax_a89cc3() {
+  var res: i32 = atomicMax(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMax_a89cc3();
+}
diff --git a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/a89cc3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMax/a89cc3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl
new file mode 100644
index 0000000..eee2d88
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicMax(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicMax_beccfc() {
+  var res: u32 = atomicMax(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMax_beccfc();
+}
diff --git a/test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMax/beccfc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMax/beccfc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMin/278235.wgsl b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl
new file mode 100644
index 0000000..e21994e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicMin(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicMin_278235() {
+  var res: i32 = atomicMin(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMin_278235();
+}
diff --git a/test/tint/builtins/gen/atomicMin/278235.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/278235.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMin/278235.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/278235.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMin/278235.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/278235.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMin/278235.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/278235.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMin/278235.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/278235.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMin/278235.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl
new file mode 100644
index 0000000..1eacad5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicMin(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicMin_69d383() {
+  var res: u32 = atomicMin(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMin_69d383();
+}
diff --git a/test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/69d383.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMin/69d383.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl
new file mode 100644
index 0000000..66134fe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicMin(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicMin_8e38dc() {
+  var res: i32 = atomicMin(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicMin_8e38dc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMin_8e38dc();
+}
diff --git a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/8e38dc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl
new file mode 100644
index 0000000..150bb3f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicMin(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicMin_c67a74() {
+  var res: u32 = atomicMin(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicMin_c67a74();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicMin_c67a74();
+}
diff --git a/test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicMin/c67a74.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl
new file mode 100644
index 0000000..17f9ba17
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicOr(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicOr_5e3d61() {
+  var res: u32 = atomicOr(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicOr_5e3d61();
+}
diff --git a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e3d61.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicOr/5e3d61.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl
new file mode 100644
index 0000000..64fd1553
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicOr(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicOr_5e95d4() {
+  var res: u32 = atomicOr(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicOr_5e95d4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicOr_5e95d4();
+}
diff --git a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/5e95d4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl
new file mode 100644
index 0000000..506fe20
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicOr(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicOr_8d96a0() {
+  var res: i32 = atomicOr(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicOr_8d96a0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicOr_8d96a0();
+}
diff --git a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/8d96a0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl
new file mode 100644
index 0000000..29d80f8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicOr(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicOr_d09248() {
+  var res: i32 = atomicOr(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicOr_d09248();
+}
diff --git a/test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicOr/d09248.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicOr/d09248.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicStore/726882.wgsl b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl
new file mode 100644
index 0000000..c9ebbff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicStore(ptr<workgroup, atomic<u32>, read_write>, u32)
+fn atomicStore_726882() {
+  atomicStore(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicStore_726882();
+}
diff --git a/test/tint/builtins/gen/atomicStore/726882.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/726882.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicStore/726882.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/726882.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicStore/726882.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/726882.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicStore/726882.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/726882.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicStore/726882.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/726882.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicStore/726882.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl
new file mode 100644
index 0000000..079c62e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicStore(ptr<workgroup, atomic<i32>, read_write>, i32)
+fn atomicStore_8bea94() {
+  atomicStore(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicStore_8bea94();
+}
diff --git a/test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/8bea94.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicStore/8bea94.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl
new file mode 100644
index 0000000..1b35f80
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicStore(ptr<storage, atomic<u32>, read_write>, u32)
+fn atomicStore_cdc29e() {
+  atomicStore(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicStore_cdc29e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicStore_cdc29e();
+}
diff --git a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/cdc29e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl
new file mode 100644
index 0000000..00cb359
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicStore(ptr<storage, atomic<i32>, read_write>, i32)
+fn atomicStore_d1e9a6() {
+  atomicStore(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicStore_d1e9a6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicStore_d1e9a6();
+}
diff --git a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicStore/d1e9a6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicSub/051100.wgsl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl
new file mode 100644
index 0000000..38f24bc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicSub(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicSub_051100() {
+  var res: i32 = atomicSub(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicSub_051100();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicSub_051100();
+}
diff --git a/test/tint/builtins/gen/atomicSub/051100.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/051100.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicSub/051100.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/051100.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicSub/051100.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/051100.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicSub/051100.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/051100.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicSub/051100.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/051100.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl
new file mode 100644
index 0000000..4104bbf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicSub(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicSub_0d26c2() {
+  var res: u32 = atomicSub(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicSub_0d26c2();
+}
diff --git a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/0d26c2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicSub/0d26c2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl
new file mode 100644
index 0000000..fb46746
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicSub(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicSub_15bfc9() {
+  var res: u32 = atomicSub(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicSub_15bfc9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicSub_15bfc9();
+}
diff --git a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/15bfc9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl
new file mode 100644
index 0000000..257aead
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicSub(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicSub_77883a() {
+  var res: i32 = atomicSub(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicSub_77883a();
+}
diff --git a/test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicSub/77883a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicSub/77883a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl
new file mode 100644
index 0000000..8de2df6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<u32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicXor(ptr<storage, atomic<u32>, read_write>, u32) -> u32
+fn atomicXor_54510e() {
+  var res: u32 = atomicXor(&sb_rw.arg_0, 1u);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicXor_54510e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicXor_54510e();
+}
diff --git a/test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/54510e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl
new file mode 100644
index 0000000..8bc0705
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<i32>;
+
+// fn atomicXor(ptr<workgroup, atomic<i32>, read_write>, i32) -> i32
+fn atomicXor_75dc95() {
+  var res: i32 = atomicXor(&arg_0, 1);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicXor_75dc95();
+}
diff --git a/test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/75dc95.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicXor/75dc95.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl
new file mode 100644
index 0000000..9fd915e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl
@@ -0,0 +1,43 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+struct SB_RW {
+  arg_0: atomic<i32>,
+};
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
+
+// fn atomicXor(ptr<storage, atomic<i32>, read_write>, i32) -> i32
+fn atomicXor_c1b78c() {
+  var res: i32 = atomicXor(&sb_rw.arg_0, 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  atomicXor_c1b78c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicXor_c1b78c();
+}
diff --git a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c1b78c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl
new file mode 100644
index 0000000..5a7f935
--- /dev/null
+++ b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl
@@ -0,0 +1,35 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+var<workgroup> arg_0: atomic<u32>;
+
+// fn atomicXor(ptr<workgroup, atomic<u32>, read_write>, u32) -> u32
+fn atomicXor_c8e6be() {
+  var res: u32 = atomicXor(&arg_0, 1u);
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  atomicXor_c8e6be();
+}
diff --git a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.msl b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/atomicXor/c8e6be.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/atomicXor/c8e6be.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ceil/34064b.wgsl b/test/tint/builtins/gen/literal/ceil/34064b.wgsl
new file mode 100644
index 0000000..99b39a4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ceil/34064b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ceil(vec<3, f32>) -> vec<3, f32>
+fn ceil_34064b() {
+  var res: vec3<f32> = ceil(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ceil_34064b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ceil_34064b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ceil_34064b();
+}
diff --git a/test/tint/builtins/gen/ceil/34064b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/34064b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ceil/34064b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/34064b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ceil/34064b.wgsl.expected.msl b/test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ceil/34064b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ceil/34064b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ceil/34064b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ceil/34064b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/34064b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ceil/34064b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ceil/678655.wgsl b/test/tint/builtins/gen/literal/ceil/678655.wgsl
new file mode 100644
index 0000000..7af7800
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ceil/678655.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ceil(f32) -> f32
+fn ceil_678655() {
+  var res: f32 = ceil(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ceil_678655();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ceil_678655();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ceil_678655();
+}
diff --git a/test/tint/builtins/gen/ceil/678655.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/678655.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ceil/678655.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/678655.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ceil/678655.wgsl.expected.msl b/test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ceil/678655.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ceil/678655.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ceil/678655.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ceil/678655.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/678655.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ceil/678655.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ceil/96f597.wgsl b/test/tint/builtins/gen/literal/ceil/96f597.wgsl
new file mode 100644
index 0000000..13dd9af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ceil/96f597.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ceil(vec<2, f32>) -> vec<2, f32>
+fn ceil_96f597() {
+  var res: vec2<f32> = ceil(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ceil_96f597();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ceil_96f597();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ceil_96f597();
+}
diff --git a/test/tint/builtins/gen/ceil/96f597.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/96f597.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ceil/96f597.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/96f597.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ceil/96f597.wgsl.expected.msl b/test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ceil/96f597.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ceil/96f597.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ceil/96f597.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ceil/96f597.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/96f597.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ceil/96f597.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ceil/b74c16.wgsl b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl
new file mode 100644
index 0000000..6f2a52f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ceil(vec<4, f32>) -> vec<4, f32>
+fn ceil_b74c16() {
+  var res: vec4<f32> = ceil(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ceil_b74c16();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ceil_b74c16();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ceil_b74c16();
+}
diff --git a/test/tint/builtins/gen/ceil/b74c16.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/b74c16.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ceil/b74c16.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/b74c16.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ceil/b74c16.wgsl.expected.msl b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ceil/b74c16.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ceil/b74c16.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ceil/b74c16.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ceil/b74c16.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ceil/b74c16.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ceil/b74c16.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl
new file mode 100644
index 0000000..75e94ee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn clamp_0acf8f() {
+  var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_0acf8f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_0acf8f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_0acf8f();
+}
diff --git a/test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/0acf8f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/0acf8f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl
new file mode 100644
index 0000000..908c846
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<4, i32>, vec<4, i32>, vec<4, i32>) -> vec<4, i32>
+fn clamp_1a32e3() {
+  var res: vec4<i32> = clamp(vec4<i32>(), vec4<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_1a32e3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_1a32e3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_1a32e3();
+}
diff --git a/test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/1a32e3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/1a32e3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/2bd567.wgsl b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl
new file mode 100644
index 0000000..464ea33
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(f32, f32, f32) -> f32
+fn clamp_2bd567() {
+  var res: f32 = clamp(1.0, 1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_2bd567();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_2bd567();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_2bd567();
+}
diff --git a/test/tint/builtins/gen/clamp/2bd567.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bd567.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/2bd567.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bd567.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/2bd567.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bd567.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/2bd567.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bd567.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/2bd567.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bd567.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/2bd567.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/2bde41.wgsl b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl
new file mode 100644
index 0000000..0b91f22
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn clamp_2bde41() {
+  var res: vec4<f32> = clamp(vec4<f32>(), vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_2bde41();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_2bde41();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_2bde41();
+}
diff --git a/test/tint/builtins/gen/clamp/2bde41.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bde41.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/2bde41.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bde41.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/2bde41.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bde41.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/2bde41.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bde41.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/2bde41.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/2bde41.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/2bde41.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/548fc7.wgsl b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl
new file mode 100644
index 0000000..a12a22e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<3, u32>, vec<3, u32>, vec<3, u32>) -> vec<3, u32>
+fn clamp_548fc7() {
+  var res: vec3<u32> = clamp(vec3<u32>(), vec3<u32>(), vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_548fc7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_548fc7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_548fc7();
+}
diff --git a/test/tint/builtins/gen/clamp/548fc7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/548fc7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/548fc7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/548fc7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/548fc7.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/548fc7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/548fc7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/548fc7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/548fc7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/548fc7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/548fc7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/5f0819.wgsl b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl
new file mode 100644
index 0000000..04d79c7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<3, i32>, vec<3, i32>, vec<3, i32>) -> vec<3, i32>
+fn clamp_5f0819() {
+  var res: vec3<i32> = clamp(vec3<i32>(), vec3<i32>(), vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_5f0819();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_5f0819();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_5f0819();
+}
diff --git a/test/tint/builtins/gen/clamp/5f0819.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/5f0819.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/5f0819.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/5f0819.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/5f0819.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/5f0819.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/5f0819.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/5f0819.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/5f0819.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/5f0819.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/5f0819.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/6c1749.wgsl b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl
new file mode 100644
index 0000000..430bd15
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<2, i32>, vec<2, i32>, vec<2, i32>) -> vec<2, i32>
+fn clamp_6c1749() {
+  var res: vec2<i32> = clamp(vec2<i32>(), vec2<i32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_6c1749();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_6c1749();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_6c1749();
+}
diff --git a/test/tint/builtins/gen/clamp/6c1749.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/6c1749.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/6c1749.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/6c1749.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/6c1749.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/6c1749.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/6c1749.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/6c1749.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/6c1749.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/6c1749.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/6c1749.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/7706d7.wgsl b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl
new file mode 100644
index 0000000..381e25d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<2, u32>, vec<2, u32>, vec<2, u32>) -> vec<2, u32>
+fn clamp_7706d7() {
+  var res: vec2<u32> = clamp(vec2<u32>(), vec2<u32>(), vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_7706d7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_7706d7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_7706d7();
+}
diff --git a/test/tint/builtins/gen/clamp/7706d7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/7706d7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/7706d7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/7706d7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/7706d7.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/7706d7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/7706d7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/7706d7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/7706d7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/7706d7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/7706d7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/867397.wgsl b/test/tint/builtins/gen/literal/clamp/867397.wgsl
new file mode 100644
index 0000000..91cacc2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/867397.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn clamp_867397() {
+  var res: vec3<f32> = clamp(vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_867397();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_867397();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_867397();
+}
diff --git a/test/tint/builtins/gen/clamp/867397.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/867397.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/867397.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/867397.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/867397.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/867397.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/867397.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/867397.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/867397.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/867397.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/867397.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/a2de25.wgsl b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl
new file mode 100644
index 0000000..bc687e3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(u32, u32, u32) -> u32
+fn clamp_a2de25() {
+  var res: u32 = clamp(1u, 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_a2de25();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_a2de25();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_a2de25();
+}
diff --git a/test/tint/builtins/gen/clamp/a2de25.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/a2de25.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/a2de25.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/a2de25.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/a2de25.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/a2de25.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/a2de25.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/a2de25.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/a2de25.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/a2de25.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/a2de25.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/b07c65.wgsl b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl
new file mode 100644
index 0000000..4387f72
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(i32, i32, i32) -> i32
+fn clamp_b07c65() {
+  var res: i32 = clamp(1, 1, 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_b07c65();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_b07c65();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_b07c65();
+}
diff --git a/test/tint/builtins/gen/clamp/b07c65.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/b07c65.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/b07c65.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/b07c65.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/b07c65.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/b07c65.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/b07c65.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/b07c65.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/b07c65.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/b07c65.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/b07c65.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl
new file mode 100644
index 0000000..80d6b85
--- /dev/null
+++ b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn clamp(vec<4, u32>, vec<4, u32>, vec<4, u32>) -> vec<4, u32>
+fn clamp_bd43ce() {
+  var res: vec4<u32> = clamp(vec4<u32>(), vec4<u32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  clamp_bd43ce();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  clamp_bd43ce();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  clamp_bd43ce();
+}
diff --git a/test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.glsl b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.msl b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/clamp/bd43ce.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/clamp/bd43ce.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cos/16dc15.wgsl b/test/tint/builtins/gen/literal/cos/16dc15.wgsl
new file mode 100644
index 0000000..a49842f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cos/16dc15.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cos(vec<3, f32>) -> vec<3, f32>
+fn cos_16dc15() {
+  var res: vec3<f32> = cos(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cos_16dc15();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cos_16dc15();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cos_16dc15();
+}
diff --git a/test/tint/builtins/gen/cos/16dc15.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cos/16dc15.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cos/16dc15.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cos/16dc15.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cos/16dc15.wgsl.expected.msl b/test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cos/16dc15.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cos/16dc15.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cos/16dc15.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cos/16dc15.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cos/16dc15.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cos/16dc15.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cos/29d66d.wgsl b/test/tint/builtins/gen/literal/cos/29d66d.wgsl
new file mode 100644
index 0000000..2488f6f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cos/29d66d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cos(vec<4, f32>) -> vec<4, f32>
+fn cos_29d66d() {
+  var res: vec4<f32> = cos(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cos_29d66d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cos_29d66d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cos_29d66d();
+}
diff --git a/test/tint/builtins/gen/cos/29d66d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cos/29d66d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cos/29d66d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cos/29d66d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cos/29d66d.wgsl.expected.msl b/test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cos/29d66d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cos/29d66d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cos/29d66d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cos/29d66d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cos/29d66d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cos/29d66d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cos/c3b486.wgsl b/test/tint/builtins/gen/literal/cos/c3b486.wgsl
new file mode 100644
index 0000000..053ed82
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cos/c3b486.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cos(vec<2, f32>) -> vec<2, f32>
+fn cos_c3b486() {
+  var res: vec2<f32> = cos(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cos_c3b486();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cos_c3b486();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cos_c3b486();
+}
diff --git a/test/tint/builtins/gen/cos/c3b486.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cos/c3b486.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cos/c3b486.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cos/c3b486.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cos/c3b486.wgsl.expected.msl b/test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cos/c3b486.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cos/c3b486.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cos/c3b486.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cos/c3b486.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cos/c3b486.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cos/c3b486.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cos/c5c28e.wgsl b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl
new file mode 100644
index 0000000..649e53f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cos(f32) -> f32
+fn cos_c5c28e() {
+  var res: f32 = cos(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cos_c5c28e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cos_c5c28e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cos_c5c28e();
+}
diff --git a/test/tint/builtins/gen/cos/c5c28e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cos/c5c28e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cos/c5c28e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cos/c5c28e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cos/c5c28e.wgsl.expected.msl b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cos/c5c28e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cos/c5c28e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cos/c5c28e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cos/c5c28e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cos/c5c28e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cos/c5c28e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cosh/377652.wgsl b/test/tint/builtins/gen/literal/cosh/377652.wgsl
new file mode 100644
index 0000000..b30d0f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cosh/377652.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cosh(vec<3, f32>) -> vec<3, f32>
+fn cosh_377652() {
+  var res: vec3<f32> = cosh(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cosh_377652();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cosh_377652();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cosh_377652();
+}
diff --git a/test/tint/builtins/gen/cosh/377652.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/377652.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cosh/377652.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/377652.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cosh/377652.wgsl.expected.msl b/test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cosh/377652.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cosh/377652.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cosh/377652.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cosh/377652.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/377652.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cosh/377652.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cosh/c13756.wgsl b/test/tint/builtins/gen/literal/cosh/c13756.wgsl
new file mode 100644
index 0000000..fb791cf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cosh/c13756.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cosh(vec<2, f32>) -> vec<2, f32>
+fn cosh_c13756() {
+  var res: vec2<f32> = cosh(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cosh_c13756();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cosh_c13756();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cosh_c13756();
+}
diff --git a/test/tint/builtins/gen/cosh/c13756.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/c13756.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cosh/c13756.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/c13756.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cosh/c13756.wgsl.expected.msl b/test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cosh/c13756.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cosh/c13756.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cosh/c13756.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cosh/c13756.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/c13756.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cosh/c13756.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cosh/da92dd.wgsl b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl
new file mode 100644
index 0000000..61dc016
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cosh(f32) -> f32
+fn cosh_da92dd() {
+  var res: f32 = cosh(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cosh_da92dd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cosh_da92dd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cosh_da92dd();
+}
diff --git a/test/tint/builtins/gen/cosh/da92dd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/da92dd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cosh/da92dd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/da92dd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cosh/da92dd.wgsl.expected.msl b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cosh/da92dd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cosh/da92dd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cosh/da92dd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cosh/da92dd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/da92dd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cosh/da92dd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl
new file mode 100644
index 0000000..10fe5b4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cosh(vec<4, f32>) -> vec<4, f32>
+fn cosh_e0c1de() {
+  var res: vec4<f32> = cosh(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cosh_e0c1de();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cosh_e0c1de();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cosh_e0c1de();
+}
diff --git a/test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.msl b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cosh/e0c1de.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cosh/e0c1de.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl
new file mode 100644
index 0000000..b68a887
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(u32) -> u32
+fn countLeadingZeros_208d46() {
+  var res: u32 = countLeadingZeros(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_208d46();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_208d46();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_208d46();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/208d46.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/208d46.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl
new file mode 100644
index 0000000..bb8d2f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(i32) -> i32
+fn countLeadingZeros_6d4656() {
+  var res: i32 = countLeadingZeros(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_6d4656();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_6d4656();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_6d4656();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/6d4656.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/6d4656.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl
new file mode 100644
index 0000000..2c807da
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(vec<2, u32>) -> vec<2, u32>
+fn countLeadingZeros_70783f() {
+  var res: vec2<u32> = countLeadingZeros(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_70783f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_70783f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_70783f();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/70783f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/70783f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl
new file mode 100644
index 0000000..d17f72b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(vec<3, i32>) -> vec<3, i32>
+fn countLeadingZeros_7c38a6() {
+  var res: vec3<i32> = countLeadingZeros(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_7c38a6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_7c38a6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_7c38a6();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/7c38a6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/7c38a6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl
new file mode 100644
index 0000000..6690e55
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(vec<2, i32>) -> vec<2, i32>
+fn countLeadingZeros_858d40() {
+  var res: vec2<i32> = countLeadingZeros(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_858d40();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_858d40();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_858d40();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/858d40.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/858d40.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl
new file mode 100644
index 0000000..64926a4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(vec<3, u32>) -> vec<3, u32>
+fn countLeadingZeros_ab6345() {
+  var res: vec3<u32> = countLeadingZeros(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_ab6345();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_ab6345();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_ab6345();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/ab6345.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/ab6345.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl
new file mode 100644
index 0000000..b62ce85
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(vec<4, i32>) -> vec<4, i32>
+fn countLeadingZeros_eab32b() {
+  var res: vec4<i32> = countLeadingZeros(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_eab32b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_eab32b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_eab32b();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/eab32b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/eab32b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl
new file mode 100644
index 0000000..0c19060
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countLeadingZeros(vec<4, u32>) -> vec<4, u32>
+fn countLeadingZeros_f70103() {
+  var res: vec4<u32> = countLeadingZeros(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countLeadingZeros_f70103();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countLeadingZeros_f70103();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countLeadingZeros_f70103();
+}
diff --git a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.msl b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countLeadingZeros/f70103.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countLeadingZeros/f70103.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl
new file mode 100644
index 0000000..cd82445
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(vec<4, u32>) -> vec<4, u32>
+fn countOneBits_0d0e46() {
+  var res: vec4<u32> = countOneBits(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_0d0e46();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_0d0e46();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_0d0e46();
+}
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/0d0e46.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl
new file mode 100644
index 0000000..0e1a0c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(vec<4, i32>) -> vec<4, i32>
+fn countOneBits_0f7980() {
+  var res: vec4<i32> = countOneBits(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_0f7980();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_0f7980();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_0f7980();
+}
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/0f7980.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl
new file mode 100644
index 0000000..b2d344b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(vec<3, i32>) -> vec<3, i32>
+fn countOneBits_65d2ae() {
+  var res: vec3<i32> = countOneBits(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_65d2ae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_65d2ae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_65d2ae();
+}
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/65d2ae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl
new file mode 100644
index 0000000..3ffaaad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(vec<3, u32>) -> vec<3, u32>
+fn countOneBits_690cfc() {
+  var res: vec3<u32> = countOneBits(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_690cfc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_690cfc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_690cfc();
+}
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/690cfc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl
new file mode 100644
index 0000000..f3dc811
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(vec<2, u32>) -> vec<2, u32>
+fn countOneBits_94fd81() {
+  var res: vec2<u32> = countOneBits(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_94fd81();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_94fd81();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_94fd81();
+}
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/94fd81.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl
new file mode 100644
index 0000000..db3be10
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(u32) -> u32
+fn countOneBits_ae44f9() {
+  var res: u32 = countOneBits(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_ae44f9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_ae44f9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_ae44f9();
+}
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/ae44f9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl
new file mode 100644
index 0000000..1a12e33
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(vec<2, i32>) -> vec<2, i32>
+fn countOneBits_af90e2() {
+  var res: vec2<i32> = countOneBits(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_af90e2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_af90e2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_af90e2();
+}
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/af90e2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl
new file mode 100644
index 0000000..7f1ec3c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countOneBits(i32) -> i32
+fn countOneBits_fd88b2() {
+  var res: i32 = countOneBits(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countOneBits_fd88b2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countOneBits_fd88b2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countOneBits_fd88b2();
+}
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.msl b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countOneBits/fd88b2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl
new file mode 100644
index 0000000..ead70fa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(vec<2, u32>) -> vec<2, u32>
+fn countTrailingZeros_1ad138() {
+  var res: vec2<u32> = countTrailingZeros(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_1ad138();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_1ad138();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_1ad138();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1ad138.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1ad138.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl
new file mode 100644
index 0000000..0a6e556
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(vec<4, i32>) -> vec<4, i32>
+fn countTrailingZeros_1dc84a() {
+  var res: vec4<i32> = countTrailingZeros(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_1dc84a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_1dc84a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_1dc84a();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/1dc84a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/1dc84a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl
new file mode 100644
index 0000000..114ae57
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(u32) -> u32
+fn countTrailingZeros_21e394() {
+  var res: u32 = countTrailingZeros(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_21e394();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_21e394();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_21e394();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/21e394.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/21e394.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl
new file mode 100644
index 0000000..36f93b1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(vec<2, i32>) -> vec<2, i32>
+fn countTrailingZeros_327c37() {
+  var res: vec2<i32> = countTrailingZeros(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_327c37();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_327c37();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_327c37();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/327c37.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/327c37.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl
new file mode 100644
index 0000000..178f96e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(i32) -> i32
+fn countTrailingZeros_42fed6() {
+  var res: i32 = countTrailingZeros(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_42fed6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_42fed6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_42fed6();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/42fed6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/42fed6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl
new file mode 100644
index 0000000..5e515f9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(vec<3, u32>) -> vec<3, u32>
+fn countTrailingZeros_8ed26f() {
+  var res: vec3<u32> = countTrailingZeros(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_8ed26f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_8ed26f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_8ed26f();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/8ed26f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/8ed26f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl
new file mode 100644
index 0000000..59019eb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(vec<3, i32>) -> vec<3, i32>
+fn countTrailingZeros_acfacb() {
+  var res: vec3<i32> = countTrailingZeros(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_acfacb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_acfacb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_acfacb();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/acfacb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/acfacb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl
new file mode 100644
index 0000000..4ce8b4d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn countTrailingZeros(vec<4, u32>) -> vec<4, u32>
+fn countTrailingZeros_d2b4a0() {
+  var res: vec4<u32> = countTrailingZeros(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  countTrailingZeros_d2b4a0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  countTrailingZeros_d2b4a0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  countTrailingZeros_d2b4a0();
+}
diff --git a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.msl b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/countTrailingZeros/d2b4a0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/countTrailingZeros/d2b4a0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/cross/041cb0.wgsl b/test/tint/builtins/gen/literal/cross/041cb0.wgsl
new file mode 100644
index 0000000..1d68e7c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/cross/041cb0.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn cross(vec3<f32>, vec3<f32>) -> vec3<f32>
+fn cross_041cb0() {
+  var res: vec3<f32> = cross(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  cross_041cb0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  cross_041cb0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  cross_041cb0();
+}
diff --git a/test/tint/builtins/gen/cross/041cb0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/cross/041cb0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/cross/041cb0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/cross/041cb0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/cross/041cb0.wgsl.expected.msl b/test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/cross/041cb0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/cross/041cb0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/cross/041cb0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/cross/041cb0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/cross/041cb0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/cross/041cb0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/degrees/0d170c.wgsl b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl
new file mode 100644
index 0000000..eb22063
--- /dev/null
+++ b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn degrees(vec<4, f32>) -> vec<4, f32>
+fn degrees_0d170c() {
+  var res: vec4<f32> = degrees(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  degrees_0d170c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  degrees_0d170c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  degrees_0d170c();
+}
diff --git a/test/tint/builtins/gen/degrees/0d170c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/0d170c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/degrees/0d170c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/0d170c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/degrees/0d170c.wgsl.expected.msl b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/degrees/0d170c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/degrees/0d170c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/degrees/0d170c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/degrees/0d170c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/0d170c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/degrees/0d170c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl
new file mode 100644
index 0000000..a0dac14b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn degrees(vec<2, f32>) -> vec<2, f32>
+fn degrees_1ad5df() {
+  var res: vec2<f32> = degrees(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  degrees_1ad5df();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  degrees_1ad5df();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  degrees_1ad5df();
+}
diff --git a/test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.glsl b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.msl b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/1ad5df.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/degrees/1ad5df.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/degrees/2af623.wgsl b/test/tint/builtins/gen/literal/degrees/2af623.wgsl
new file mode 100644
index 0000000..b01e1a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/degrees/2af623.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn degrees(vec<3, f32>) -> vec<3, f32>
+fn degrees_2af623() {
+  var res: vec3<f32> = degrees(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  degrees_2af623();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  degrees_2af623();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  degrees_2af623();
+}
diff --git a/test/tint/builtins/gen/degrees/2af623.wgsl.expected.glsl b/test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/2af623.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/degrees/2af623.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/2af623.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/degrees/2af623.wgsl.expected.msl b/test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/degrees/2af623.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/degrees/2af623.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/degrees/2af623.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/degrees/2af623.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/2af623.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/degrees/2af623.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/degrees/51f705.wgsl b/test/tint/builtins/gen/literal/degrees/51f705.wgsl
new file mode 100644
index 0000000..3ff7ece
--- /dev/null
+++ b/test/tint/builtins/gen/literal/degrees/51f705.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn degrees(f32) -> f32
+fn degrees_51f705() {
+  var res: f32 = degrees(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  degrees_51f705();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  degrees_51f705();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  degrees_51f705();
+}
diff --git a/test/tint/builtins/gen/degrees/51f705.wgsl.expected.glsl b/test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/51f705.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/degrees/51f705.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/51f705.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/degrees/51f705.wgsl.expected.msl b/test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/degrees/51f705.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/degrees/51f705.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/degrees/51f705.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/degrees/51f705.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/degrees/51f705.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/degrees/51f705.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl
new file mode 100644
index 0000000..8c5b626
--- /dev/null
+++ b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn determinant(mat<3, 3, f32>) -> f32
+fn determinant_2b62ba() {
+  var res: f32 = determinant(mat3x3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  determinant_2b62ba();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  determinant_2b62ba();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  determinant_2b62ba();
+}
diff --git a/test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.glsl b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.msl b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/2b62ba.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/determinant/2b62ba.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl
new file mode 100644
index 0000000..541f546
--- /dev/null
+++ b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn determinant(mat<4, 4, f32>) -> f32
+fn determinant_a0a87c() {
+  var res: f32 = determinant(mat4x4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  determinant_a0a87c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  determinant_a0a87c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  determinant_a0a87c();
+}
diff --git a/test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.msl b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/a0a87c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/determinant/a0a87c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/determinant/e19305.wgsl b/test/tint/builtins/gen/literal/determinant/e19305.wgsl
new file mode 100644
index 0000000..18cc6b2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/determinant/e19305.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn determinant(mat<2, 2, f32>) -> f32
+fn determinant_e19305() {
+  var res: f32 = determinant(mat2x2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  determinant_e19305();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  determinant_e19305();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  determinant_e19305();
+}
diff --git a/test/tint/builtins/gen/determinant/e19305.wgsl.expected.glsl b/test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/e19305.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/determinant/e19305.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/e19305.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/determinant/e19305.wgsl.expected.msl b/test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/determinant/e19305.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/determinant/e19305.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/determinant/e19305.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/determinant/e19305.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/determinant/e19305.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/determinant/e19305.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/distance/0657d4.wgsl b/test/tint/builtins/gen/literal/distance/0657d4.wgsl
new file mode 100644
index 0000000..a0b3af8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/distance/0657d4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn distance(vec<3, f32>, vec<3, f32>) -> f32
+fn distance_0657d4() {
+  var res: f32 = distance(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  distance_0657d4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  distance_0657d4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  distance_0657d4();
+}
diff --git a/test/tint/builtins/gen/distance/0657d4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/distance/0657d4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/distance/0657d4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/distance/0657d4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/distance/0657d4.wgsl.expected.msl b/test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/distance/0657d4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/distance/0657d4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/distance/0657d4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/distance/0657d4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/distance/0657d4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/distance/0657d4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/distance/9646ea.wgsl b/test/tint/builtins/gen/literal/distance/9646ea.wgsl
new file mode 100644
index 0000000..3b8aa55
--- /dev/null
+++ b/test/tint/builtins/gen/literal/distance/9646ea.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn distance(vec<4, f32>, vec<4, f32>) -> f32
+fn distance_9646ea() {
+  var res: f32 = distance(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  distance_9646ea();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  distance_9646ea();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  distance_9646ea();
+}
diff --git a/test/tint/builtins/gen/distance/9646ea.wgsl.expected.glsl b/test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/distance/9646ea.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/distance/9646ea.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/distance/9646ea.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/distance/9646ea.wgsl.expected.msl b/test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/distance/9646ea.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/distance/9646ea.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/distance/9646ea.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/distance/9646ea.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/distance/9646ea.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/distance/9646ea.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/distance/aa4055.wgsl b/test/tint/builtins/gen/literal/distance/aa4055.wgsl
new file mode 100644
index 0000000..71334d5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/distance/aa4055.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn distance(vec<2, f32>, vec<2, f32>) -> f32
+fn distance_aa4055() {
+  var res: f32 = distance(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  distance_aa4055();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  distance_aa4055();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  distance_aa4055();
+}
diff --git a/test/tint/builtins/gen/distance/aa4055.wgsl.expected.glsl b/test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/distance/aa4055.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/distance/aa4055.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/distance/aa4055.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/distance/aa4055.wgsl.expected.msl b/test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/distance/aa4055.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/distance/aa4055.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/distance/aa4055.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/distance/aa4055.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/distance/aa4055.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/distance/aa4055.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/distance/cfed73.wgsl b/test/tint/builtins/gen/literal/distance/cfed73.wgsl
new file mode 100644
index 0000000..c7fe4c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/distance/cfed73.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn distance(f32, f32) -> f32
+fn distance_cfed73() {
+  var res: f32 = distance(1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  distance_cfed73();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  distance_cfed73();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  distance_cfed73();
+}
diff --git a/test/tint/builtins/gen/distance/cfed73.wgsl.expected.glsl b/test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/distance/cfed73.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/distance/cfed73.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/distance/cfed73.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/distance/cfed73.wgsl.expected.msl b/test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/distance/cfed73.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/distance/cfed73.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/distance/cfed73.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/distance/cfed73.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/distance/cfed73.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/distance/cfed73.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/0c577b.wgsl b/test/tint/builtins/gen/literal/dot/0c577b.wgsl
new file mode 100644
index 0000000..e48b669
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/0c577b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<4, f32>, vec<4, f32>) -> f32
+fn dot_0c577b() {
+  var res: f32 = dot(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_0c577b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_0c577b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_0c577b();
+}
diff --git a/test/tint/builtins/gen/dot/0c577b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/0c577b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/0c577b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/0c577b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/0c577b.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/0c577b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/0c577b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/0c577b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/0c577b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/0c577b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/0c577b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/7548a0.wgsl b/test/tint/builtins/gen/literal/dot/7548a0.wgsl
new file mode 100644
index 0000000..567e340
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/7548a0.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<3, u32>, vec<3, u32>) -> u32
+fn dot_7548a0() {
+  var res: u32 = dot(vec3<u32>(), vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_7548a0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_7548a0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_7548a0();
+}
diff --git a/test/tint/builtins/gen/dot/7548a0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/7548a0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/7548a0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/7548a0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/7548a0.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/7548a0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/7548a0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/7548a0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/7548a0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/7548a0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/7548a0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/883f0e.wgsl b/test/tint/builtins/gen/literal/dot/883f0e.wgsl
new file mode 100644
index 0000000..fbf13b5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/883f0e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<2, f32>, vec<2, f32>) -> f32
+fn dot_883f0e() {
+  var res: f32 = dot(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_883f0e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_883f0e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_883f0e();
+}
diff --git a/test/tint/builtins/gen/dot/883f0e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/883f0e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/883f0e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/883f0e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/883f0e.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/883f0e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/883f0e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/883f0e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/883f0e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/883f0e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/883f0e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/97c7ee.wgsl b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl
new file mode 100644
index 0000000..f802cca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<2, u32>, vec<2, u32>) -> u32
+fn dot_97c7ee() {
+  var res: u32 = dot(vec2<u32>(), vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_97c7ee();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_97c7ee();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_97c7ee();
+}
diff --git a/test/tint/builtins/gen/dot/97c7ee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/97c7ee.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/97c7ee.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/97c7ee.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/97c7ee.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/97c7ee.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/97c7ee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/97c7ee.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/97c7ee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/97c7ee.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/97c7ee.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/ba4246.wgsl b/test/tint/builtins/gen/literal/dot/ba4246.wgsl
new file mode 100644
index 0000000..ed2c792
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/ba4246.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<3, f32>, vec<3, f32>) -> f32
+fn dot_ba4246() {
+  var res: f32 = dot(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_ba4246();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_ba4246();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_ba4246();
+}
diff --git a/test/tint/builtins/gen/dot/ba4246.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/ba4246.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/ba4246.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/ba4246.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/ba4246.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/ba4246.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/ba4246.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/ba4246.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/ba4246.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/ba4246.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/ba4246.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/e994c7.wgsl b/test/tint/builtins/gen/literal/dot/e994c7.wgsl
new file mode 100644
index 0000000..bbcfafb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/e994c7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<4, u32>, vec<4, u32>) -> u32
+fn dot_e994c7() {
+  var res: u32 = dot(vec4<u32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_e994c7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_e994c7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_e994c7();
+}
diff --git a/test/tint/builtins/gen/dot/e994c7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/e994c7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/e994c7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/e994c7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/e994c7.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/e994c7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/e994c7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/e994c7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/e994c7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/e994c7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/e994c7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl
new file mode 100644
index 0000000..2c73a7a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<4, i32>, vec<4, i32>) -> i32
+fn dot_ef6b1d() {
+  var res: i32 = dot(vec4<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_ef6b1d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_ef6b1d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_ef6b1d();
+}
diff --git a/test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/ef6b1d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/ef6b1d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/f1312c.wgsl b/test/tint/builtins/gen/literal/dot/f1312c.wgsl
new file mode 100644
index 0000000..7966682
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/f1312c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<3, i32>, vec<3, i32>) -> i32
+fn dot_f1312c() {
+  var res: i32 = dot(vec3<i32>(), vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_f1312c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_f1312c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_f1312c();
+}
diff --git a/test/tint/builtins/gen/dot/f1312c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/f1312c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/f1312c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/f1312c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/f1312c.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/f1312c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/f1312c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/f1312c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/f1312c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/f1312c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/f1312c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl
new file mode 100644
index 0000000..a7d1354
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dot(vec<2, i32>, vec<2, i32>) -> i32
+fn dot_fc5f7c() {
+  var res: i32 = dot(vec2<i32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  dot_fc5f7c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dot_fc5f7c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  dot_fc5f7c();
+}
diff --git a/test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.msl b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dot/fc5f7c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dot/fc5f7c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl
new file mode 100644
index 0000000..0c0cfad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdx(vec<3, f32>) -> vec<3, f32>
+fn dpdx_0763f7() {
+  var res: vec3<f32> = dpdx(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdx_0763f7();
+}
diff --git a/test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/0763f7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdx/0763f7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl
new file mode 100644
index 0000000..45393f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdx(vec<2, f32>) -> vec<2, f32>
+fn dpdx_99edb1() {
+  var res: vec2<f32> = dpdx(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdx_99edb1();
+}
diff --git a/test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/99edb1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdx/99edb1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl
new file mode 100644
index 0000000..c05487c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdx(vec<4, f32>) -> vec<4, f32>
+fn dpdx_c487fa() {
+  var res: vec4<f32> = dpdx(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdx_c487fa();
+}
diff --git a/test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/c487fa.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdx/c487fa.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdx/e263de.wgsl b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl
new file mode 100644
index 0000000..f367bd5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdx(f32) -> f32
+fn dpdx_e263de() {
+  var res: f32 = dpdx(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdx_e263de();
+}
diff --git a/test/tint/builtins/gen/dpdx/e263de.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/e263de.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdx/e263de.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/e263de.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdx/e263de.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/e263de.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdx/e263de.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdx/e263de.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdx/e263de.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdx/e263de.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdx/e263de.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl
new file mode 100644
index 0000000..c490c29
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxCoarse(f32) -> f32
+fn dpdxCoarse_029152() {
+  var res: f32 = dpdxCoarse(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxCoarse_029152();
+}
diff --git a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/029152.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/029152.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl
new file mode 100644
index 0000000..864f0a1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxCoarse(vec<2, f32>) -> vec<2, f32>
+fn dpdxCoarse_9581cf() {
+  var res: vec2<f32> = dpdxCoarse(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxCoarse_9581cf();
+}
diff --git a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/9581cf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/9581cf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl
new file mode 100644
index 0000000..98b2ca8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxCoarse(vec<4, f32>) -> vec<4, f32>
+fn dpdxCoarse_c28641() {
+  var res: vec4<f32> = dpdxCoarse(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxCoarse_c28641();
+}
diff --git a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/c28641.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/c28641.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl
new file mode 100644
index 0000000..b9e6721
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxCoarse(vec<3, f32>) -> vec<3, f32>
+fn dpdxCoarse_f64d7b() {
+  var res: vec3<f32> = dpdxCoarse(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxCoarse_f64d7b();
+}
diff --git a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxCoarse/f64d7b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxCoarse/f64d7b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl
new file mode 100644
index 0000000..55e5fdd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxFine(vec<4, f32>) -> vec<4, f32>
+fn dpdxFine_8c5069() {
+  var res: vec4<f32> = dpdxFine(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxFine_8c5069();
+}
diff --git a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/8c5069.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxFine/8c5069.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl
new file mode 100644
index 0000000..96f4ef3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxFine(vec<2, f32>) -> vec<2, f32>
+fn dpdxFine_9631de() {
+  var res: vec2<f32> = dpdxFine(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxFine_9631de();
+}
diff --git a/test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/9631de.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxFine/9631de.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl
new file mode 100644
index 0000000..0c28759
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxFine(f32) -> f32
+fn dpdxFine_f401a2() {
+  var res: f32 = dpdxFine(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxFine_f401a2();
+}
diff --git a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f401a2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxFine/f401a2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl
new file mode 100644
index 0000000..c387414
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdxFine(vec<3, f32>) -> vec<3, f32>
+fn dpdxFine_f92fb6() {
+  var res: vec3<f32> = dpdxFine(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdxFine_f92fb6();
+}
diff --git a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdxFine/f92fb6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdxFine/f92fb6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdy/699a05.wgsl b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl
new file mode 100644
index 0000000..14025bc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdy(vec<4, f32>) -> vec<4, f32>
+fn dpdy_699a05() {
+  var res: vec4<f32> = dpdy(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdy_699a05();
+}
diff --git a/test/tint/builtins/gen/dpdy/699a05.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/699a05.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdy/699a05.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/699a05.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdy/699a05.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/699a05.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdy/699a05.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdy/699a05.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdy/699a05.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/699a05.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdy/699a05.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl
new file mode 100644
index 0000000..4d2fb93
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdy(f32) -> f32
+fn dpdy_7f8d84() {
+  var res: f32 = dpdy(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdy_7f8d84();
+}
diff --git a/test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/7f8d84.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdy/7f8d84.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl
new file mode 100644
index 0000000..f7a51b3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdy(vec<2, f32>) -> vec<2, f32>
+fn dpdy_a8b56e() {
+  var res: vec2<f32> = dpdy(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdy_a8b56e();
+}
diff --git a/test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/a8b56e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdy/a8b56e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl
new file mode 100644
index 0000000..ac9641c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdy(vec<3, f32>) -> vec<3, f32>
+fn dpdy_feb40f() {
+  var res: vec3<f32> = dpdy(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdy_feb40f();
+}
diff --git a/test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdy/feb40f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdy/feb40f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl
new file mode 100644
index 0000000..7e36fd0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyCoarse(vec<2, f32>) -> vec<2, f32>
+fn dpdyCoarse_3e1ab4() {
+  var res: vec2<f32> = dpdyCoarse(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyCoarse_3e1ab4();
+}
diff --git a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/3e1ab4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/3e1ab4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl
new file mode 100644
index 0000000..99ef18d4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyCoarse(vec<4, f32>) -> vec<4, f32>
+fn dpdyCoarse_445d24() {
+  var res: vec4<f32> = dpdyCoarse(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyCoarse_445d24();
+}
diff --git a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/445d24.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/445d24.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl
new file mode 100644
index 0000000..f7cff8d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyCoarse(f32) -> f32
+fn dpdyCoarse_870a7e() {
+  var res: f32 = dpdyCoarse(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyCoarse_870a7e();
+}
diff --git a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/870a7e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/870a7e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl
new file mode 100644
index 0000000..f5d5fdb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyCoarse(vec<3, f32>) -> vec<3, f32>
+fn dpdyCoarse_ae1873() {
+  var res: vec3<f32> = dpdyCoarse(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyCoarse_ae1873();
+}
diff --git a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyCoarse/ae1873.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyCoarse/ae1873.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl
new file mode 100644
index 0000000..ff40e48
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyFine(vec<3, f32>) -> vec<3, f32>
+fn dpdyFine_1fb7ab() {
+  var res: vec3<f32> = dpdyFine(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyFine_1fb7ab();
+}
diff --git a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/1fb7ab.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyFine/1fb7ab.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl
new file mode 100644
index 0000000..67acf71
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyFine(f32) -> f32
+fn dpdyFine_6eb673() {
+  var res: f32 = dpdyFine(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyFine_6eb673();
+}
diff --git a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/6eb673.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyFine/6eb673.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl
new file mode 100644
index 0000000..9b0a079
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyFine(vec<4, f32>) -> vec<4, f32>
+fn dpdyFine_d0a648() {
+  var res: vec4<f32> = dpdyFine(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyFine_d0a648();
+}
diff --git a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/d0a648.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyFine/d0a648.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl
new file mode 100644
index 0000000..1686e0d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn dpdyFine(vec<2, f32>) -> vec<2, f32>
+fn dpdyFine_df33aa() {
+  var res: vec2<f32> = dpdyFine(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  dpdyFine_df33aa();
+}
diff --git a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.glsl b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.msl b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/dpdyFine/df33aa.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/dpdyFine/df33aa.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp/0f70eb.wgsl b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl
new file mode 100644
index 0000000..7778d3f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp(vec<4, f32>) -> vec<4, f32>
+fn exp_0f70eb() {
+  var res: vec4<f32> = exp(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp_0f70eb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp_0f70eb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp_0f70eb();
+}
diff --git a/test/tint/builtins/gen/exp/0f70eb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp/0f70eb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp/0f70eb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp/0f70eb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp/0f70eb.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp/0f70eb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp/0f70eb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp/0f70eb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp/0f70eb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp/0f70eb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp/0f70eb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp/1951e7.wgsl b/test/tint/builtins/gen/literal/exp/1951e7.wgsl
new file mode 100644
index 0000000..3f525c0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp/1951e7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp(vec<2, f32>) -> vec<2, f32>
+fn exp_1951e7() {
+  var res: vec2<f32> = exp(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp_1951e7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp_1951e7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp_1951e7();
+}
diff --git a/test/tint/builtins/gen/exp/1951e7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp/1951e7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp/1951e7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp/1951e7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp/1951e7.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp/1951e7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp/1951e7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp/1951e7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp/1951e7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp/1951e7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp/1951e7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp/771fd2.wgsl b/test/tint/builtins/gen/literal/exp/771fd2.wgsl
new file mode 100644
index 0000000..f5cb802
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp/771fd2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp(f32) -> f32
+fn exp_771fd2() {
+  var res: f32 = exp(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp_771fd2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp_771fd2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp_771fd2();
+}
diff --git a/test/tint/builtins/gen/exp/771fd2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp/771fd2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp/771fd2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp/771fd2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp/771fd2.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp/771fd2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp/771fd2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp/771fd2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp/771fd2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp/771fd2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp/771fd2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp/d98450.wgsl b/test/tint/builtins/gen/literal/exp/d98450.wgsl
new file mode 100644
index 0000000..de9f545
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp/d98450.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp(vec<3, f32>) -> vec<3, f32>
+fn exp_d98450() {
+  var res: vec3<f32> = exp(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp_d98450();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp_d98450();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp_d98450();
+}
diff --git a/test/tint/builtins/gen/exp/d98450.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp/d98450.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp/d98450.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp/d98450.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp/d98450.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp/d98450.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp/d98450.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp/d98450.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp/d98450.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp/d98450.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp/d98450.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp2/1f8680.wgsl b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl
new file mode 100644
index 0000000..bd6cf52
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp2(vec<3, f32>) -> vec<3, f32>
+fn exp2_1f8680() {
+  var res: vec3<f32> = exp2(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp2_1f8680();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp2_1f8680();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp2_1f8680();
+}
diff --git a/test/tint/builtins/gen/exp2/1f8680.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/1f8680.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp2/1f8680.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/1f8680.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp2/1f8680.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp2/1f8680.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp2/1f8680.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp2/1f8680.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp2/1f8680.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/1f8680.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp2/1f8680.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl
new file mode 100644
index 0000000..6afd6df
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp2(vec<4, f32>) -> vec<4, f32>
+fn exp2_a9d0a7() {
+  var res: vec4<f32> = exp2(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp2_a9d0a7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp2_a9d0a7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp2_a9d0a7();
+}
diff --git a/test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/a9d0a7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp2/a9d0a7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp2/d6777c.wgsl b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl
new file mode 100644
index 0000000..f11932f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp2(vec<2, f32>) -> vec<2, f32>
+fn exp2_d6777c() {
+  var res: vec2<f32> = exp2(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp2_d6777c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp2_d6777c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp2_d6777c();
+}
diff --git a/test/tint/builtins/gen/exp2/d6777c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/d6777c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp2/d6777c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/d6777c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp2/d6777c.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp2/d6777c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp2/d6777c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp2/d6777c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp2/d6777c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/d6777c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp2/d6777c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/exp2/dea523.wgsl b/test/tint/builtins/gen/literal/exp2/dea523.wgsl
new file mode 100644
index 0000000..2930f50
--- /dev/null
+++ b/test/tint/builtins/gen/literal/exp2/dea523.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn exp2(f32) -> f32
+fn exp2_dea523() {
+  var res: f32 = exp2(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  exp2_dea523();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  exp2_dea523();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  exp2_dea523();
+}
diff --git a/test/tint/builtins/gen/exp2/dea523.wgsl.expected.glsl b/test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/dea523.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/exp2/dea523.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/dea523.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/exp2/dea523.wgsl.expected.msl b/test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/exp2/dea523.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/exp2/dea523.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/exp2/dea523.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/exp2/dea523.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/exp2/dea523.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/exp2/dea523.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/12b197.wgsl b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl
new file mode 100644
index 0000000..d67e896
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(vec<3, u32>, u32, u32) -> vec<3, u32>
+fn extractBits_12b197() {
+  var res: vec3<u32> = extractBits(vec3<u32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_12b197();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_12b197();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_12b197();
+}
diff --git a/test/tint/builtins/gen/extractBits/12b197.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/12b197.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/12b197.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/12b197.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/12b197.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/12b197.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/12b197.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/12b197.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/12b197.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/12b197.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/12b197.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/249874.wgsl b/test/tint/builtins/gen/literal/extractBits/249874.wgsl
new file mode 100644
index 0000000..dc06fb7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/249874.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(i32, u32, u32) -> i32
+fn extractBits_249874() {
+  var res: i32 = extractBits(1, 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_249874();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_249874();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_249874();
+}
diff --git a/test/tint/builtins/gen/extractBits/249874.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/249874.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/249874.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/249874.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/249874.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/249874.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/249874.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/249874.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/249874.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/249874.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/249874.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/631377.wgsl b/test/tint/builtins/gen/literal/extractBits/631377.wgsl
new file mode 100644
index 0000000..ca0f97f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/631377.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(vec<4, u32>, u32, u32) -> vec<4, u32>
+fn extractBits_631377() {
+  var res: vec4<u32> = extractBits(vec4<u32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_631377();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_631377();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_631377();
+}
diff --git a/test/tint/builtins/gen/extractBits/631377.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/631377.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/631377.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/631377.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/631377.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/631377.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/631377.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/631377.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/631377.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/631377.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/631377.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl
new file mode 100644
index 0000000..2e8fb05
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(vec<2, i32>, u32, u32) -> vec<2, i32>
+fn extractBits_a99a8d() {
+  var res: vec2<i32> = extractBits(vec2<i32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_a99a8d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_a99a8d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_a99a8d();
+}
diff --git a/test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/a99a8d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/a99a8d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl
new file mode 100644
index 0000000..c99a7c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(u32, u32, u32) -> u32
+fn extractBits_ce81f8() {
+  var res: u32 = extractBits(1u, 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_ce81f8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_ce81f8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_ce81f8();
+}
diff --git a/test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/ce81f8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/ce81f8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl
new file mode 100644
index 0000000..8586101
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(vec<3, i32>, u32, u32) -> vec<3, i32>
+fn extractBits_e04f5d() {
+  var res: vec3<i32> = extractBits(vec3<i32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_e04f5d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_e04f5d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_e04f5d();
+}
diff --git a/test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/e04f5d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/e04f5d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl
new file mode 100644
index 0000000..9a358de
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(vec<2, u32>, u32, u32) -> vec<2, u32>
+fn extractBits_f28f69() {
+  var res: vec2<u32> = extractBits(vec2<u32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_f28f69();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_f28f69();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_f28f69();
+}
diff --git a/test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/f28f69.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/f28f69.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl
new file mode 100644
index 0000000..aeb2fd7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn extractBits(vec<4, i32>, u32, u32) -> vec<4, i32>
+fn extractBits_fb850f() {
+  var res: vec4<i32> = extractBits(vec4<i32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  extractBits_fb850f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  extractBits_fb850f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  extractBits_fb850f();
+}
diff --git a/test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.msl b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/extractBits/fb850f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/extractBits/fb850f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl
new file mode 100644
index 0000000..99f293a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn faceForward(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn faceForward_5afbd5() {
+  var res: vec3<f32> = faceForward(vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  faceForward_5afbd5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  faceForward_5afbd5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  faceForward_5afbd5();
+}
diff --git a/test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.msl b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/5afbd5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/faceForward/5afbd5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl
new file mode 100644
index 0000000..4782cf6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn faceForward(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn faceForward_b316e5() {
+  var res: vec4<f32> = faceForward(vec4<f32>(), vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  faceForward_b316e5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  faceForward_b316e5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  faceForward_b316e5();
+}
diff --git a/test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.msl b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/b316e5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/faceForward/b316e5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl
new file mode 100644
index 0000000..ee829ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn faceForward(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn faceForward_e6908b() {
+  var res: vec2<f32> = faceForward(vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  faceForward_e6908b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  faceForward_e6908b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  faceForward_e6908b();
+}
diff --git a/test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.msl b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/faceForward/e6908b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/faceForward/e6908b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl
new file mode 100644
index 0000000..faa49e4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(vec<4, u32>) -> vec<4, u32>
+fn firstLeadingBit_000ff3() {
+  var res: vec4<u32> = firstLeadingBit(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_000ff3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_000ff3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_000ff3();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/000ff3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/000ff3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl
new file mode 100644
index 0000000..5922e0d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(vec<3, i32>) -> vec<3, i32>
+fn firstLeadingBit_35053e() {
+  var res: vec3<i32> = firstLeadingBit(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_35053e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_35053e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_35053e();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/35053e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/35053e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl
new file mode 100644
index 0000000..e799c27
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(vec<3, u32>) -> vec<3, u32>
+fn firstLeadingBit_3fd7d0() {
+  var res: vec3<u32> = firstLeadingBit(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_3fd7d0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_3fd7d0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_3fd7d0();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/3fd7d0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/3fd7d0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl
new file mode 100644
index 0000000..c79d1dd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(i32) -> i32
+fn firstLeadingBit_57a1a3() {
+  var res: i32 = firstLeadingBit(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_57a1a3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_57a1a3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_57a1a3();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/57a1a3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/57a1a3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl
new file mode 100644
index 0000000..87838a7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(vec<2, u32>) -> vec<2, u32>
+fn firstLeadingBit_6fe804() {
+  var res: vec2<u32> = firstLeadingBit(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_6fe804();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_6fe804();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_6fe804();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/6fe804.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/6fe804.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl
new file mode 100644
index 0000000..64b2c7b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(vec<2, i32>) -> vec<2, i32>
+fn firstLeadingBit_a622c2() {
+  var res: vec2<i32> = firstLeadingBit(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_a622c2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_a622c2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_a622c2();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/a622c2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/a622c2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl
new file mode 100644
index 0000000..f09a593
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(vec<4, i32>) -> vec<4, i32>
+fn firstLeadingBit_c1f940() {
+  var res: vec4<i32> = firstLeadingBit(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_c1f940();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_c1f940();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_c1f940();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/c1f940.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/c1f940.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl
new file mode 100644
index 0000000..a1a5a3d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstLeadingBit(u32) -> u32
+fn firstLeadingBit_f0779d() {
+  var res: u32 = firstLeadingBit(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstLeadingBit_f0779d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstLeadingBit_f0779d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstLeadingBit_f0779d();
+}
diff --git a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstLeadingBit/f0779d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstLeadingBit/f0779d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl
new file mode 100644
index 0000000..818e922
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(vec<4, u32>) -> vec<4, u32>
+fn firstTrailingBit_110f2c() {
+  var res: vec4<u32> = firstTrailingBit(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_110f2c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_110f2c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_110f2c();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/110f2c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/110f2c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl
new file mode 100644
index 0000000..3842f4f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(i32) -> i32
+fn firstTrailingBit_3a2acc() {
+  var res: i32 = firstTrailingBit(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_3a2acc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_3a2acc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_3a2acc();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/3a2acc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/3a2acc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl
new file mode 100644
index 0000000..396593e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(vec<2, u32>) -> vec<2, u32>
+fn firstTrailingBit_45eb10() {
+  var res: vec2<u32> = firstTrailingBit(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_45eb10();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_45eb10();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_45eb10();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/45eb10.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/45eb10.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl
new file mode 100644
index 0000000..d0268af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(u32) -> u32
+fn firstTrailingBit_47d475() {
+  var res: u32 = firstTrailingBit(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_47d475();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_47d475();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_47d475();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/47d475.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/47d475.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl
new file mode 100644
index 0000000..fa986e0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(vec<2, i32>) -> vec<2, i32>
+fn firstTrailingBit_50c072() {
+  var res: vec2<i32> = firstTrailingBit(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_50c072();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_50c072();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_50c072();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/50c072.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/50c072.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl
new file mode 100644
index 0000000..c1dff0a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(vec<3, i32>) -> vec<3, i32>
+fn firstTrailingBit_7496d6() {
+  var res: vec3<i32> = firstTrailingBit(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_7496d6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_7496d6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_7496d6();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/7496d6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/7496d6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl
new file mode 100644
index 0000000..97e389e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(vec<4, i32>) -> vec<4, i32>
+fn firstTrailingBit_86551b() {
+  var res: vec4<i32> = firstTrailingBit(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_86551b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_86551b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_86551b();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/86551b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/86551b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl
new file mode 100644
index 0000000..895e9bb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn firstTrailingBit(vec<3, u32>) -> vec<3, u32>
+fn firstTrailingBit_cb51ce() {
+  var res: vec3<u32> = firstTrailingBit(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  firstTrailingBit_cb51ce();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  firstTrailingBit_cb51ce();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  firstTrailingBit_cb51ce();
+}
diff --git a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.glsl b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.msl b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/firstTrailingBit/cb51ce.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/firstTrailingBit/cb51ce.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/floor/3bccc4.wgsl b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl
new file mode 100644
index 0000000..117cb5c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn floor(vec<4, f32>) -> vec<4, f32>
+fn floor_3bccc4() {
+  var res: vec4<f32> = floor(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  floor_3bccc4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  floor_3bccc4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  floor_3bccc4();
+}
diff --git a/test/tint/builtins/gen/floor/3bccc4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/floor/3bccc4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/floor/3bccc4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/floor/3bccc4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/floor/3bccc4.wgsl.expected.msl b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/floor/3bccc4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/floor/3bccc4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/floor/3bccc4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/floor/3bccc4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/floor/3bccc4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/floor/3bccc4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl
new file mode 100644
index 0000000..daab170
--- /dev/null
+++ b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn floor(vec<2, f32>) -> vec<2, f32>
+fn floor_5fc9ac() {
+  var res: vec2<f32> = floor(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  floor_5fc9ac();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  floor_5fc9ac();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  floor_5fc9ac();
+}
diff --git a/test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.glsl b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.msl b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/floor/5fc9ac.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/floor/5fc9ac.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/floor/60d7ea.wgsl b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl
new file mode 100644
index 0000000..0cbaf43
--- /dev/null
+++ b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn floor(vec<3, f32>) -> vec<3, f32>
+fn floor_60d7ea() {
+  var res: vec3<f32> = floor(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  floor_60d7ea();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  floor_60d7ea();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  floor_60d7ea();
+}
diff --git a/test/tint/builtins/gen/floor/60d7ea.wgsl.expected.glsl b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/floor/60d7ea.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/floor/60d7ea.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/floor/60d7ea.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/floor/60d7ea.wgsl.expected.msl b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/floor/60d7ea.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/floor/60d7ea.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/floor/60d7ea.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/floor/60d7ea.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/floor/60d7ea.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/floor/60d7ea.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/floor/66f154.wgsl b/test/tint/builtins/gen/literal/floor/66f154.wgsl
new file mode 100644
index 0000000..ec55b67
--- /dev/null
+++ b/test/tint/builtins/gen/literal/floor/66f154.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn floor(f32) -> f32
+fn floor_66f154() {
+  var res: f32 = floor(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  floor_66f154();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  floor_66f154();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  floor_66f154();
+}
diff --git a/test/tint/builtins/gen/floor/66f154.wgsl.expected.glsl b/test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/floor/66f154.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/floor/66f154.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/floor/66f154.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/floor/66f154.wgsl.expected.msl b/test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/floor/66f154.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/floor/66f154.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/floor/66f154.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/floor/66f154.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/floor/66f154.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/floor/66f154.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fma/26a7a9.wgsl b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl
new file mode 100644
index 0000000..834ed38
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fma(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn fma_26a7a9() {
+  var res: vec2<f32> = fma(vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fma_26a7a9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fma_26a7a9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fma_26a7a9();
+}
diff --git a/test/tint/builtins/gen/fma/26a7a9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fma/26a7a9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fma/26a7a9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fma/26a7a9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fma/26a7a9.wgsl.expected.msl b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fma/26a7a9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fma/26a7a9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fma/26a7a9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fma/26a7a9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fma/26a7a9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fma/26a7a9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fma/6a3283.wgsl b/test/tint/builtins/gen/literal/fma/6a3283.wgsl
new file mode 100644
index 0000000..d5cf90f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fma/6a3283.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fma(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn fma_6a3283() {
+  var res: vec4<f32> = fma(vec4<f32>(), vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fma_6a3283();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fma_6a3283();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fma_6a3283();
+}
diff --git a/test/tint/builtins/gen/fma/6a3283.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fma/6a3283.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fma/6a3283.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fma/6a3283.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fma/6a3283.wgsl.expected.msl b/test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fma/6a3283.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fma/6a3283.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fma/6a3283.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fma/6a3283.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fma/6a3283.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fma/6a3283.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fma/c10ba3.wgsl b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl
new file mode 100644
index 0000000..d26b504
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fma(f32, f32, f32) -> f32
+fn fma_c10ba3() {
+  var res: f32 = fma(1.0, 1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fma_c10ba3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fma_c10ba3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fma_c10ba3();
+}
diff --git a/test/tint/builtins/gen/fma/c10ba3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fma/c10ba3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fma/c10ba3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fma/c10ba3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fma/c10ba3.wgsl.expected.msl b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fma/c10ba3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fma/c10ba3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fma/c10ba3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fma/c10ba3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fma/c10ba3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fma/c10ba3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fma/e17c5c.wgsl b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl
new file mode 100644
index 0000000..afba1f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fma(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn fma_e17c5c() {
+  var res: vec3<f32> = fma(vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fma_e17c5c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fma_e17c5c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fma_e17c5c();
+}
diff --git a/test/tint/builtins/gen/fma/e17c5c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fma/e17c5c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fma/e17c5c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fma/e17c5c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fma/e17c5c.wgsl.expected.msl b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fma/e17c5c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fma/e17c5c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fma/e17c5c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fma/e17c5c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fma/e17c5c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fma/e17c5c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl
new file mode 100644
index 0000000..c816bce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fract(vec<4, f32>) -> vec<4, f32>
+fn fract_8bc1e9() {
+  var res: vec4<f32> = fract(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fract_8bc1e9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fract_8bc1e9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fract_8bc1e9();
+}
diff --git a/test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.msl b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fract/8bc1e9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fract/8bc1e9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fract/943cb1.wgsl b/test/tint/builtins/gen/literal/fract/943cb1.wgsl
new file mode 100644
index 0000000..a940bab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fract/943cb1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fract(vec<2, f32>) -> vec<2, f32>
+fn fract_943cb1() {
+  var res: vec2<f32> = fract(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fract_943cb1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fract_943cb1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fract_943cb1();
+}
diff --git a/test/tint/builtins/gen/fract/943cb1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fract/943cb1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fract/943cb1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fract/943cb1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fract/943cb1.wgsl.expected.msl b/test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fract/943cb1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fract/943cb1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fract/943cb1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fract/943cb1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fract/943cb1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fract/943cb1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fract/a49758.wgsl b/test/tint/builtins/gen/literal/fract/a49758.wgsl
new file mode 100644
index 0000000..693a6e9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fract/a49758.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fract(vec<3, f32>) -> vec<3, f32>
+fn fract_a49758() {
+  var res: vec3<f32> = fract(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fract_a49758();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fract_a49758();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fract_a49758();
+}
diff --git a/test/tint/builtins/gen/fract/a49758.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fract/a49758.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fract/a49758.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fract/a49758.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fract/a49758.wgsl.expected.msl b/test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fract/a49758.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fract/a49758.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fract/a49758.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fract/a49758.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fract/a49758.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fract/a49758.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fract/fa5c71.wgsl b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl
new file mode 100644
index 0000000..c2e96d2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fract(f32) -> f32
+fn fract_fa5c71() {
+  var res: f32 = fract(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  fract_fa5c71();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fract_fa5c71();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  fract_fa5c71();
+}
diff --git a/test/tint/builtins/gen/fract/fa5c71.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fract/fa5c71.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fract/fa5c71.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fract/fa5c71.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fract/fa5c71.wgsl.expected.msl b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fract/fa5c71.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fract/fa5c71.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fract/fa5c71.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fract/fa5c71.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fract/fa5c71.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fract/fa5c71.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/frexp/368997.wgsl b/test/tint/builtins/gen/literal/frexp/368997.wgsl
new file mode 100644
index 0000000..42095a8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/frexp/368997.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(vec<3, f32>) -> __frexp_result_vec<3>
+fn frexp_368997() {
+  var res = frexp(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  frexp_368997();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  frexp_368997();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  frexp_368997();
+}
diff --git a/test/tint/builtins/gen/frexp/368997.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/368997.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/frexp/368997.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/368997.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/frexp/368997.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/frexp/368997.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/frexp/368997.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/frexp/368997.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/frexp/368997.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/368997.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/frexp/368997.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl
new file mode 100644
index 0000000..13c6c1e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(vec<4, f32>) -> __frexp_result_vec<4>
+fn frexp_3c4f48() {
+  var res = frexp(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  frexp_3c4f48();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  frexp_3c4f48();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  frexp_3c4f48();
+}
diff --git a/test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/3c4f48.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/frexp/3c4f48.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl
new file mode 100644
index 0000000..78428e3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(vec<2, f32>) -> __frexp_result_vec<2>
+fn frexp_4bdfc7() {
+  var res = frexp(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  frexp_4bdfc7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  frexp_4bdfc7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  frexp_4bdfc7();
+}
diff --git a/test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/4bdfc7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/frexp/4bdfc7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/frexp/eabd40.wgsl b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl
new file mode 100644
index 0000000..a2feb4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(f32) -> __frexp_result
+fn frexp_eabd40() {
+  var res = frexp(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  frexp_eabd40();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  frexp_eabd40();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  frexp_eabd40();
+}
diff --git a/test/tint/builtins/gen/frexp/eabd40.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/eabd40.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/frexp/eabd40.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/eabd40.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/frexp/eabd40.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/frexp/eabd40.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/frexp/eabd40.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/frexp/eabd40.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/frexp/eabd40.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/frexp/eabd40.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/frexp/eabd40.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl
new file mode 100644
index 0000000..08e2628
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidth(vec<3, f32>) -> vec<3, f32>
+fn fwidth_5d1b39() {
+  var res: vec3<f32> = fwidth(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidth_5d1b39();
+}
diff --git a/test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/5d1b39.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidth/5d1b39.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl
new file mode 100644
index 0000000..a63be9c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidth(vec<2, f32>) -> vec<2, f32>
+fn fwidth_b83ebb() {
+  var res: vec2<f32> = fwidth(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidth_b83ebb();
+}
diff --git a/test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/b83ebb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidth/b83ebb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl
new file mode 100644
index 0000000..01a99c6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidth(vec<4, f32>) -> vec<4, f32>
+fn fwidth_d2ab9a() {
+  var res: vec4<f32> = fwidth(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidth_d2ab9a();
+}
diff --git a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/d2ab9a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidth/d2ab9a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl
new file mode 100644
index 0000000..5733522
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidth(f32) -> f32
+fn fwidth_df38ef() {
+  var res: f32 = fwidth(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidth_df38ef();
+}
diff --git a/test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidth/df38ef.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidth/df38ef.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl
new file mode 100644
index 0000000..6c82cb2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthCoarse(f32) -> f32
+fn fwidthCoarse_159c8a() {
+  var res: f32 = fwidthCoarse(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthCoarse_159c8a();
+}
diff --git a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/159c8a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/159c8a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl
new file mode 100644
index 0000000..1973cd7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthCoarse(vec<3, f32>) -> vec<3, f32>
+fn fwidthCoarse_1e59d9() {
+  var res: vec3<f32> = fwidthCoarse(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthCoarse_1e59d9();
+}
diff --git a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/1e59d9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/1e59d9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl
new file mode 100644
index 0000000..56243c3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthCoarse(vec<4, f32>) -> vec<4, f32>
+fn fwidthCoarse_4e4fc4() {
+  var res: vec4<f32> = fwidthCoarse(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthCoarse_4e4fc4();
+}
diff --git a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/4e4fc4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/4e4fc4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl
new file mode 100644
index 0000000..389e52d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthCoarse(vec<2, f32>) -> vec<2, f32>
+fn fwidthCoarse_e653f7() {
+  var res: vec2<f32> = fwidthCoarse(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthCoarse_e653f7();
+}
diff --git a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthCoarse/e653f7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthCoarse/e653f7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl
new file mode 100644
index 0000000..93bc440
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthFine(vec<3, f32>) -> vec<3, f32>
+fn fwidthFine_523fdc() {
+  var res: vec3<f32> = fwidthFine(vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthFine_523fdc();
+}
diff --git a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/523fdc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthFine/523fdc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl
new file mode 100644
index 0000000..80005f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthFine(vec<4, f32>) -> vec<4, f32>
+fn fwidthFine_68f4ef() {
+  var res: vec4<f32> = fwidthFine(vec4<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthFine_68f4ef();
+}
diff --git a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/68f4ef.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthFine/68f4ef.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl
new file mode 100644
index 0000000..4310d22
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthFine(f32) -> f32
+fn fwidthFine_f1742d() {
+  var res: f32 = fwidthFine(1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthFine_f1742d();
+}
diff --git a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/f1742d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthFine/f1742d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl
new file mode 100644
index 0000000..e8e4c08
--- /dev/null
+++ b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn fwidthFine(vec<2, f32>) -> vec<2, f32>
+fn fwidthFine_ff6aa0() {
+  var res: vec2<f32> = fwidthFine(vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  fwidthFine_ff6aa0();
+}
diff --git a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.msl b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/fwidthFine/ff6aa0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/fwidthFine/ff6aa0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl
new file mode 100644
index 0000000..f5879a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(vec<2, u32>, vec<2, u32>, u32, u32) -> vec<2, u32>
+fn insertBits_3c7ba5() {
+  var res: vec2<u32> = insertBits(vec2<u32>(), vec2<u32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_3c7ba5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_3c7ba5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_3c7ba5();
+}
diff --git a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/3c7ba5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/3c7ba5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl
new file mode 100644
index 0000000..1dd773e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(vec<3, i32>, vec<3, i32>, u32, u32) -> vec<3, i32>
+fn insertBits_428b0b() {
+  var res: vec3<i32> = insertBits(vec3<i32>(), vec3<i32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_428b0b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_428b0b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_428b0b();
+}
diff --git a/test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/428b0b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/428b0b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl
new file mode 100644
index 0000000..0ba617a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(vec<4, u32>, vec<4, u32>, u32, u32) -> vec<4, u32>
+fn insertBits_51ede1() {
+  var res: vec4<u32> = insertBits(vec4<u32>(), vec4<u32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_51ede1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_51ede1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_51ede1();
+}
diff --git a/test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/51ede1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/51ede1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/65468b.wgsl b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl
new file mode 100644
index 0000000..b426cf5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(i32, i32, u32, u32) -> i32
+fn insertBits_65468b() {
+  var res: i32 = insertBits(1, 1, 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_65468b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_65468b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_65468b();
+}
diff --git a/test/tint/builtins/gen/insertBits/65468b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/65468b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/65468b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/65468b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/65468b.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/65468b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/65468b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/65468b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/65468b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/65468b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/65468b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/87826b.wgsl b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl
new file mode 100644
index 0000000..6ca4dd0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(vec<3, u32>, vec<3, u32>, u32, u32) -> vec<3, u32>
+fn insertBits_87826b() {
+  var res: vec3<u32> = insertBits(vec3<u32>(), vec3<u32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_87826b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_87826b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_87826b();
+}
diff --git a/test/tint/builtins/gen/insertBits/87826b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/87826b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/87826b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/87826b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/87826b.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/87826b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/87826b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/87826b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/87826b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/87826b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/87826b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/d86978.wgsl b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl
new file mode 100644
index 0000000..421a875
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(vec<4, i32>, vec<4, i32>, u32, u32) -> vec<4, i32>
+fn insertBits_d86978() {
+  var res: vec4<i32> = insertBits(vec4<i32>(), vec4<i32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_d86978();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_d86978();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_d86978();
+}
diff --git a/test/tint/builtins/gen/insertBits/d86978.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/d86978.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/d86978.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/d86978.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/d86978.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/d86978.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/d86978.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/d86978.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/d86978.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/d86978.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/d86978.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl
new file mode 100644
index 0000000..7e12f24
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(u32, u32, u32, u32) -> u32
+fn insertBits_e3e3a2() {
+  var res: u32 = insertBits(1u, 1u, 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_e3e3a2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_e3e3a2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_e3e3a2();
+}
diff --git a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/e3e3a2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/e3e3a2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl
new file mode 100644
index 0000000..56c4b03
--- /dev/null
+++ b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn insertBits(vec<2, i32>, vec<2, i32>, u32, u32) -> vec<2, i32>
+fn insertBits_fe6ba6() {
+  var res: vec2<i32> = insertBits(vec2<i32>(), vec2<i32>(), 1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  insertBits_fe6ba6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  insertBits_fe6ba6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  insertBits_fe6ba6();
+}
diff --git a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.msl b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/insertBits/fe6ba6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/insertBits/fe6ba6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl
new file mode 100644
index 0000000..3d97d0f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn inverseSqrt(f32) -> f32
+fn inverseSqrt_84407e() {
+  var res: f32 = inverseSqrt(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  inverseSqrt_84407e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  inverseSqrt_84407e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  inverseSqrt_84407e();
+}
diff --git a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.msl b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/84407e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/inverseSqrt/84407e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl
new file mode 100644
index 0000000..d64ff26
--- /dev/null
+++ b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn inverseSqrt(vec<2, f32>) -> vec<2, f32>
+fn inverseSqrt_8f2bd2() {
+  var res: vec2<f32> = inverseSqrt(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  inverseSqrt_8f2bd2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  inverseSqrt_8f2bd2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  inverseSqrt_8f2bd2();
+}
diff --git a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.msl b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/8f2bd2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/inverseSqrt/8f2bd2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl
new file mode 100644
index 0000000..1fe63f9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn inverseSqrt(vec<3, f32>) -> vec<3, f32>
+fn inverseSqrt_b197b1() {
+  var res: vec3<f32> = inverseSqrt(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  inverseSqrt_b197b1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  inverseSqrt_b197b1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  inverseSqrt_b197b1();
+}
diff --git a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.msl b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/b197b1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/inverseSqrt/b197b1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl
new file mode 100644
index 0000000..4536cb7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn inverseSqrt(vec<4, f32>) -> vec<4, f32>
+fn inverseSqrt_c22347() {
+  var res: vec4<f32> = inverseSqrt(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  inverseSqrt_c22347();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  inverseSqrt_c22347();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  inverseSqrt_c22347();
+}
diff --git a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.glsl b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.msl b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/inverseSqrt/c22347.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/inverseSqrt/c22347.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl
new file mode 100644
index 0000000..daede0b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ldexp(vec<3, f32>, vec<3, i32>) -> vec<3, f32>
+fn ldexp_a31cdc() {
+  var res: vec3<f32> = ldexp(vec3<f32>(), vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ldexp_a31cdc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ldexp_a31cdc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ldexp_a31cdc();
+}
diff --git a/test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.msl b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/a31cdc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ldexp/a31cdc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ldexp/abd718.wgsl b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl
new file mode 100644
index 0000000..fb5d9b5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ldexp(vec<2, f32>, vec<2, i32>) -> vec<2, f32>
+fn ldexp_abd718() {
+  var res: vec2<f32> = ldexp(vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ldexp_abd718();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ldexp_abd718();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ldexp_abd718();
+}
diff --git a/test/tint/builtins/gen/ldexp/abd718.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/abd718.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ldexp/abd718.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/abd718.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ldexp/abd718.wgsl.expected.msl b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/abd718.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ldexp/abd718.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ldexp/abd718.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ldexp/abd718.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/abd718.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ldexp/abd718.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl
new file mode 100644
index 0000000..6b14529
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ldexp(vec<4, f32>, vec<4, i32>) -> vec<4, f32>
+fn ldexp_cc9cde() {
+  var res: vec4<f32> = ldexp(vec4<f32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ldexp_cc9cde();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ldexp_cc9cde();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ldexp_cc9cde();
+}
diff --git a/test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.msl b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/cc9cde.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ldexp/cc9cde.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl
new file mode 100644
index 0000000..7ed2b37
--- /dev/null
+++ b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn ldexp(f32, i32) -> f32
+fn ldexp_db8b49() {
+  var res: f32 = ldexp(1.0, 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  ldexp_db8b49();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  ldexp_db8b49();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  ldexp_db8b49();
+}
diff --git a/test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.glsl b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.msl b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/ldexp/db8b49.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/ldexp/db8b49.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/length/056071.wgsl b/test/tint/builtins/gen/literal/length/056071.wgsl
new file mode 100644
index 0000000..159a0c1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/length/056071.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn length(vec<3, f32>) -> f32
+fn length_056071() {
+  var res: f32 = length(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  length_056071();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  length_056071();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  length_056071();
+}
diff --git a/test/tint/builtins/gen/length/056071.wgsl.expected.glsl b/test/tint/builtins/gen/literal/length/056071.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/length/056071.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/length/056071.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/length/056071.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/length/056071.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/length/056071.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/length/056071.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/length/056071.wgsl.expected.msl b/test/tint/builtins/gen/literal/length/056071.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/length/056071.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/length/056071.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/length/056071.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/length/056071.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/length/056071.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/length/056071.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/length/056071.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/length/056071.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/length/056071.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/length/056071.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/length/602a17.wgsl b/test/tint/builtins/gen/literal/length/602a17.wgsl
new file mode 100644
index 0000000..4ad050b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/length/602a17.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn length(f32) -> f32
+fn length_602a17() {
+  var res: f32 = length(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  length_602a17();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  length_602a17();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  length_602a17();
+}
diff --git a/test/tint/builtins/gen/length/602a17.wgsl.expected.glsl b/test/tint/builtins/gen/literal/length/602a17.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/length/602a17.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/length/602a17.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/length/602a17.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/length/602a17.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/length/602a17.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/length/602a17.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/length/602a17.wgsl.expected.msl b/test/tint/builtins/gen/literal/length/602a17.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/length/602a17.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/length/602a17.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/length/602a17.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/length/602a17.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/length/602a17.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/length/602a17.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/length/602a17.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/length/602a17.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/length/602a17.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/length/602a17.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/length/afde8b.wgsl b/test/tint/builtins/gen/literal/length/afde8b.wgsl
new file mode 100644
index 0000000..b936e5e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/length/afde8b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn length(vec<2, f32>) -> f32
+fn length_afde8b() {
+  var res: f32 = length(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  length_afde8b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  length_afde8b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  length_afde8b();
+}
diff --git a/test/tint/builtins/gen/length/afde8b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/length/afde8b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/length/afde8b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/length/afde8b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/length/afde8b.wgsl.expected.msl b/test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/length/afde8b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/length/afde8b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/length/afde8b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/length/afde8b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/length/afde8b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/length/afde8b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/length/becebf.wgsl b/test/tint/builtins/gen/literal/length/becebf.wgsl
new file mode 100644
index 0000000..6a3481e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/length/becebf.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn length(vec<4, f32>) -> f32
+fn length_becebf() {
+  var res: f32 = length(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  length_becebf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  length_becebf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  length_becebf();
+}
diff --git a/test/tint/builtins/gen/length/becebf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/length/becebf.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/length/becebf.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/length/becebf.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/length/becebf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/length/becebf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/length/becebf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/length/becebf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/length/becebf.wgsl.expected.msl b/test/tint/builtins/gen/literal/length/becebf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/length/becebf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/length/becebf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/length/becebf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/length/becebf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/length/becebf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/length/becebf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/length/becebf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/length/becebf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/length/becebf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/length/becebf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log/3da25a.wgsl b/test/tint/builtins/gen/literal/log/3da25a.wgsl
new file mode 100644
index 0000000..b10d7ce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log/3da25a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log(vec<4, f32>) -> vec<4, f32>
+fn log_3da25a() {
+  var res: vec4<f32> = log(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log_3da25a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log_3da25a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log_3da25a();
+}
diff --git a/test/tint/builtins/gen/log/3da25a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log/3da25a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log/3da25a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log/3da25a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log/3da25a.wgsl.expected.msl b/test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log/3da25a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log/3da25a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log/3da25a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log/3da25a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log/3da25a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log/3da25a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log/7114a6.wgsl b/test/tint/builtins/gen/literal/log/7114a6.wgsl
new file mode 100644
index 0000000..3bce023
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log/7114a6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log(f32) -> f32
+fn log_7114a6() {
+  var res: f32 = log(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log_7114a6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log_7114a6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log_7114a6();
+}
diff --git a/test/tint/builtins/gen/log/7114a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log/7114a6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log/7114a6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log/7114a6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log/7114a6.wgsl.expected.msl b/test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log/7114a6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log/7114a6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log/7114a6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log/7114a6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log/7114a6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log/7114a6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log/b2ce28.wgsl b/test/tint/builtins/gen/literal/log/b2ce28.wgsl
new file mode 100644
index 0000000..842afe4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log/b2ce28.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log(vec<2, f32>) -> vec<2, f32>
+fn log_b2ce28() {
+  var res: vec2<f32> = log(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log_b2ce28();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log_b2ce28();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log_b2ce28();
+}
diff --git a/test/tint/builtins/gen/log/b2ce28.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log/b2ce28.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log/b2ce28.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log/b2ce28.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log/b2ce28.wgsl.expected.msl b/test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log/b2ce28.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log/b2ce28.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log/b2ce28.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log/b2ce28.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log/b2ce28.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log/b2ce28.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log/f4c570.wgsl b/test/tint/builtins/gen/literal/log/f4c570.wgsl
new file mode 100644
index 0000000..544d880
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log/f4c570.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log(vec<3, f32>) -> vec<3, f32>
+fn log_f4c570() {
+  var res: vec3<f32> = log(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log_f4c570();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log_f4c570();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log_f4c570();
+}
diff --git a/test/tint/builtins/gen/log/f4c570.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log/f4c570.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log/f4c570.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log/f4c570.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log/f4c570.wgsl.expected.msl b/test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log/f4c570.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log/f4c570.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log/f4c570.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log/f4c570.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log/f4c570.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log/f4c570.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log2/4036ed.wgsl b/test/tint/builtins/gen/literal/log2/4036ed.wgsl
new file mode 100644
index 0000000..da8ae3e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log2/4036ed.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log2(f32) -> f32
+fn log2_4036ed() {
+  var res: f32 = log2(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log2_4036ed();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log2_4036ed();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log2_4036ed();
+}
diff --git a/test/tint/builtins/gen/log2/4036ed.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log2/4036ed.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log2/4036ed.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log2/4036ed.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log2/4036ed.wgsl.expected.msl b/test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log2/4036ed.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log2/4036ed.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log2/4036ed.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log2/4036ed.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log2/4036ed.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log2/4036ed.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log2/902988.wgsl b/test/tint/builtins/gen/literal/log2/902988.wgsl
new file mode 100644
index 0000000..c9af854
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log2/902988.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log2(vec<4, f32>) -> vec<4, f32>
+fn log2_902988() {
+  var res: vec4<f32> = log2(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log2_902988();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log2_902988();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log2_902988();
+}
diff --git a/test/tint/builtins/gen/log2/902988.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log2/902988.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log2/902988.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log2/902988.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log2/902988.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log2/902988.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log2/902988.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log2/902988.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log2/902988.wgsl.expected.msl b/test/tint/builtins/gen/literal/log2/902988.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log2/902988.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log2/902988.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log2/902988.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log2/902988.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log2/902988.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log2/902988.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log2/902988.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log2/902988.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log2/902988.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log2/902988.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log2/adb233.wgsl b/test/tint/builtins/gen/literal/log2/adb233.wgsl
new file mode 100644
index 0000000..f4d516f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log2/adb233.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log2(vec<3, f32>) -> vec<3, f32>
+fn log2_adb233() {
+  var res: vec3<f32> = log2(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log2_adb233();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log2_adb233();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log2_adb233();
+}
diff --git a/test/tint/builtins/gen/log2/adb233.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log2/adb233.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log2/adb233.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log2/adb233.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log2/adb233.wgsl.expected.msl b/test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log2/adb233.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log2/adb233.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log2/adb233.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log2/adb233.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log2/adb233.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log2/adb233.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/log2/aea659.wgsl b/test/tint/builtins/gen/literal/log2/aea659.wgsl
new file mode 100644
index 0000000..46e3ef8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/log2/aea659.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn log2(vec<2, f32>) -> vec<2, f32>
+fn log2_aea659() {
+  var res: vec2<f32> = log2(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  log2_aea659();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  log2_aea659();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  log2_aea659();
+}
diff --git a/test/tint/builtins/gen/log2/aea659.wgsl.expected.glsl b/test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/log2/aea659.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/log2/aea659.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/log2/aea659.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/log2/aea659.wgsl.expected.msl b/test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/log2/aea659.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/log2/aea659.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/log2/aea659.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/log2/aea659.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/log2/aea659.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/log2/aea659.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/0c0aae.wgsl b/test/tint/builtins/gen/literal/max/0c0aae.wgsl
new file mode 100644
index 0000000..31e3b8c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/0c0aae.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(u32, u32) -> u32
+fn max_0c0aae() {
+  var res: u32 = max(1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_0c0aae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_0c0aae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_0c0aae();
+}
diff --git a/test/tint/builtins/gen/max/0c0aae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/0c0aae.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/0c0aae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/0c0aae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/0c0aae.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/0c0aae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/0c0aae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/0c0aae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/0c0aae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/0c0aae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/0c0aae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/25eafe.wgsl b/test/tint/builtins/gen/literal/max/25eafe.wgsl
new file mode 100644
index 0000000..717de19
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/25eafe.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<3, i32>, vec<3, i32>) -> vec<3, i32>
+fn max_25eafe() {
+  var res: vec3<i32> = max(vec3<i32>(), vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_25eafe();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_25eafe();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_25eafe();
+}
diff --git a/test/tint/builtins/gen/max/25eafe.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/25eafe.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/25eafe.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/25eafe.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/25eafe.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/25eafe.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/25eafe.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/25eafe.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/25eafe.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/25eafe.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/25eafe.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/320815.wgsl b/test/tint/builtins/gen/literal/max/320815.wgsl
new file mode 100644
index 0000000..4c70788
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/320815.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<2, u32>, vec<2, u32>) -> vec<2, u32>
+fn max_320815() {
+  var res: vec2<u32> = max(vec2<u32>(), vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_320815();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_320815();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_320815();
+}
diff --git a/test/tint/builtins/gen/max/320815.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/320815.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/320815.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/320815.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/320815.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/320815.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/320815.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/320815.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/320815.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/320815.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/320815.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/320815.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/320815.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/320815.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/320815.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/320815.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/320815.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/320815.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/320815.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/320815.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/44a39d.wgsl b/test/tint/builtins/gen/literal/max/44a39d.wgsl
new file mode 100644
index 0000000..5c38a89
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/44a39d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(f32, f32) -> f32
+fn max_44a39d() {
+  var res: f32 = max(1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_44a39d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_44a39d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_44a39d();
+}
diff --git a/test/tint/builtins/gen/max/44a39d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/44a39d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/44a39d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/44a39d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/44a39d.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/44a39d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/44a39d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/44a39d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/44a39d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/44a39d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/44a39d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/453e04.wgsl b/test/tint/builtins/gen/literal/max/453e04.wgsl
new file mode 100644
index 0000000..df4f70b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/453e04.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<4, u32>, vec<4, u32>) -> vec<4, u32>
+fn max_453e04() {
+  var res: vec4<u32> = max(vec4<u32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_453e04();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_453e04();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_453e04();
+}
diff --git a/test/tint/builtins/gen/max/453e04.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/453e04.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/453e04.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/453e04.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/453e04.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/453e04.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/453e04.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/453e04.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/453e04.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/453e04.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/453e04.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/453e04.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/453e04.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/453e04.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/453e04.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/453e04.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/453e04.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/453e04.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/453e04.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/453e04.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/462050.wgsl b/test/tint/builtins/gen/literal/max/462050.wgsl
new file mode 100644
index 0000000..7c37686
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/462050.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn max_462050() {
+  var res: vec2<f32> = max(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_462050();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_462050();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_462050();
+}
diff --git a/test/tint/builtins/gen/max/462050.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/462050.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/462050.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/462050.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/462050.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/462050.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/462050.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/462050.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/462050.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/462050.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/462050.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/462050.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/462050.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/462050.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/462050.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/462050.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/462050.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/462050.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/462050.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/462050.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/4883ac.wgsl b/test/tint/builtins/gen/literal/max/4883ac.wgsl
new file mode 100644
index 0000000..f94ba6c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/4883ac.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn max_4883ac() {
+  var res: vec3<f32> = max(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_4883ac();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_4883ac();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_4883ac();
+}
diff --git a/test/tint/builtins/gen/max/4883ac.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/4883ac.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/4883ac.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/4883ac.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/4883ac.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/4883ac.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/4883ac.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/4883ac.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/4883ac.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/4883ac.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/4883ac.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/85e6bc.wgsl b/test/tint/builtins/gen/literal/max/85e6bc.wgsl
new file mode 100644
index 0000000..e62f000
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/85e6bc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<4, i32>, vec<4, i32>) -> vec<4, i32>
+fn max_85e6bc() {
+  var res: vec4<i32> = max(vec4<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_85e6bc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_85e6bc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_85e6bc();
+}
diff --git a/test/tint/builtins/gen/max/85e6bc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/85e6bc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/85e6bc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/85e6bc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/85e6bc.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/85e6bc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/85e6bc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/85e6bc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/85e6bc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/85e6bc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/85e6bc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/a93419.wgsl b/test/tint/builtins/gen/literal/max/a93419.wgsl
new file mode 100644
index 0000000..8105d25
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/a93419.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn max_a93419() {
+  var res: vec4<f32> = max(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_a93419();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_a93419();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_a93419();
+}
diff --git a/test/tint/builtins/gen/max/a93419.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/a93419.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/a93419.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/a93419.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/a93419.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/a93419.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/a93419.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/a93419.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/a93419.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/a93419.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/a93419.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/a93419.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/a93419.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/a93419.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/a93419.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/a93419.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/a93419.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/a93419.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/a93419.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/a93419.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/b1b73a.wgsl b/test/tint/builtins/gen/literal/max/b1b73a.wgsl
new file mode 100644
index 0000000..ae43e46e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/b1b73a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<3, u32>, vec<3, u32>) -> vec<3, u32>
+fn max_b1b73a() {
+  var res: vec3<u32> = max(vec3<u32>(), vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_b1b73a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_b1b73a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_b1b73a();
+}
diff --git a/test/tint/builtins/gen/max/b1b73a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/b1b73a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/b1b73a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/b1b73a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/b1b73a.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/b1b73a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/b1b73a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/b1b73a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/b1b73a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/b1b73a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/b1b73a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/ce7c30.wgsl b/test/tint/builtins/gen/literal/max/ce7c30.wgsl
new file mode 100644
index 0000000..ce0ecbb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/ce7c30.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(i32, i32) -> i32
+fn max_ce7c30() {
+  var res: i32 = max(1, 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_ce7c30();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_ce7c30();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_ce7c30();
+}
diff --git a/test/tint/builtins/gen/max/ce7c30.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/ce7c30.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/ce7c30.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/ce7c30.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/ce7c30.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/ce7c30.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/ce7c30.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/ce7c30.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/ce7c30.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/ce7c30.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/ce7c30.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/max/e8192f.wgsl b/test/tint/builtins/gen/literal/max/e8192f.wgsl
new file mode 100644
index 0000000..61085c4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/max/e8192f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn max(vec<2, i32>, vec<2, i32>) -> vec<2, i32>
+fn max_e8192f() {
+  var res: vec2<i32> = max(vec2<i32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  max_e8192f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  max_e8192f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  max_e8192f();
+}
diff --git a/test/tint/builtins/gen/max/e8192f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/max/e8192f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/max/e8192f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/max/e8192f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/max/e8192f.wgsl.expected.msl b/test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/max/e8192f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/max/e8192f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/max/e8192f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/max/e8192f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/max/e8192f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/max/e8192f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/03c7e3.wgsl b/test/tint/builtins/gen/literal/min/03c7e3.wgsl
new file mode 100644
index 0000000..8155b49
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/03c7e3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<2, i32>, vec<2, i32>) -> vec<2, i32>
+fn min_03c7e3() {
+  var res: vec2<i32> = min(vec2<i32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_03c7e3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_03c7e3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_03c7e3();
+}
diff --git a/test/tint/builtins/gen/min/03c7e3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/03c7e3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/03c7e3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/03c7e3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/03c7e3.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/03c7e3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/03c7e3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/03c7e3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/03c7e3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/03c7e3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/03c7e3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/0dc614.wgsl b/test/tint/builtins/gen/literal/min/0dc614.wgsl
new file mode 100644
index 0000000..41af73e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/0dc614.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<4, u32>, vec<4, u32>) -> vec<4, u32>
+fn min_0dc614() {
+  var res: vec4<u32> = min(vec4<u32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_0dc614();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_0dc614();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_0dc614();
+}
diff --git a/test/tint/builtins/gen/min/0dc614.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/0dc614.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/0dc614.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/0dc614.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/0dc614.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/0dc614.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/0dc614.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/0dc614.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/0dc614.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/0dc614.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/0dc614.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/3941e1.wgsl b/test/tint/builtins/gen/literal/min/3941e1.wgsl
new file mode 100644
index 0000000..3ae488a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/3941e1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<4, i32>, vec<4, i32>) -> vec<4, i32>
+fn min_3941e1() {
+  var res: vec4<i32> = min(vec4<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_3941e1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_3941e1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_3941e1();
+}
diff --git a/test/tint/builtins/gen/min/3941e1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/3941e1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/3941e1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/3941e1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/3941e1.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/3941e1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/3941e1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/3941e1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/3941e1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/3941e1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/3941e1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/46c5d3.wgsl b/test/tint/builtins/gen/literal/min/46c5d3.wgsl
new file mode 100644
index 0000000..d81860d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/46c5d3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(u32, u32) -> u32
+fn min_46c5d3() {
+  var res: u32 = min(1u, 1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_46c5d3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_46c5d3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_46c5d3();
+}
diff --git a/test/tint/builtins/gen/min/46c5d3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/46c5d3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/46c5d3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/46c5d3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/46c5d3.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/46c5d3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/46c5d3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/46c5d3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/46c5d3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/46c5d3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/46c5d3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/82b28f.wgsl b/test/tint/builtins/gen/literal/min/82b28f.wgsl
new file mode 100644
index 0000000..7ddd2ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/82b28f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<2, u32>, vec<2, u32>) -> vec<2, u32>
+fn min_82b28f() {
+  var res: vec2<u32> = min(vec2<u32>(), vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_82b28f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_82b28f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_82b28f();
+}
diff --git a/test/tint/builtins/gen/min/82b28f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/82b28f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/82b28f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/82b28f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/82b28f.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/82b28f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/82b28f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/82b28f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/82b28f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/82b28f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/82b28f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/93cfc4.wgsl b/test/tint/builtins/gen/literal/min/93cfc4.wgsl
new file mode 100644
index 0000000..e550e19
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/93cfc4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn min_93cfc4() {
+  var res: vec3<f32> = min(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_93cfc4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_93cfc4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_93cfc4();
+}
diff --git a/test/tint/builtins/gen/min/93cfc4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/93cfc4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/93cfc4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/93cfc4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/93cfc4.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/93cfc4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/93cfc4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/93cfc4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/93cfc4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/93cfc4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/93cfc4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/a45171.wgsl b/test/tint/builtins/gen/literal/min/a45171.wgsl
new file mode 100644
index 0000000..6d0bce1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/a45171.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<3, i32>, vec<3, i32>) -> vec<3, i32>
+fn min_a45171() {
+  var res: vec3<i32> = min(vec3<i32>(), vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_a45171();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_a45171();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_a45171();
+}
diff --git a/test/tint/builtins/gen/min/a45171.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/a45171.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/a45171.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/a45171.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/a45171.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/a45171.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/a45171.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/a45171.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/a45171.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/a45171.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/a45171.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/a45171.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/a45171.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/a45171.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/a45171.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/a45171.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/a45171.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/a45171.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/a45171.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/a45171.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/aa28ad.wgsl b/test/tint/builtins/gen/literal/min/aa28ad.wgsl
new file mode 100644
index 0000000..4c1777f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/aa28ad.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn min_aa28ad() {
+  var res: vec2<f32> = min(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_aa28ad();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_aa28ad();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_aa28ad();
+}
diff --git a/test/tint/builtins/gen/min/aa28ad.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/aa28ad.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/aa28ad.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/aa28ad.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/aa28ad.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/aa28ad.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/aa28ad.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/aa28ad.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/aa28ad.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/aa28ad.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/aa28ad.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/af326d.wgsl b/test/tint/builtins/gen/literal/min/af326d.wgsl
new file mode 100644
index 0000000..d7b275d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/af326d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(f32, f32) -> f32
+fn min_af326d() {
+  var res: f32 = min(1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_af326d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_af326d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_af326d();
+}
diff --git a/test/tint/builtins/gen/min/af326d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/af326d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/af326d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/af326d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/af326d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/af326d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/af326d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/af326d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/af326d.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/af326d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/af326d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/af326d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/af326d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/af326d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/af326d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/af326d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/af326d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/af326d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/af326d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/af326d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/c70bb7.wgsl b/test/tint/builtins/gen/literal/min/c70bb7.wgsl
new file mode 100644
index 0000000..cc382f7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/c70bb7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<3, u32>, vec<3, u32>) -> vec<3, u32>
+fn min_c70bb7() {
+  var res: vec3<u32> = min(vec3<u32>(), vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_c70bb7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_c70bb7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_c70bb7();
+}
diff --git a/test/tint/builtins/gen/min/c70bb7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/c70bb7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/c70bb7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/c70bb7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/c70bb7.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/c70bb7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/c70bb7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/c70bb7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/c70bb7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/c70bb7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/c70bb7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/c73147.wgsl b/test/tint/builtins/gen/literal/min/c73147.wgsl
new file mode 100644
index 0000000..f7c6d21
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/c73147.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(i32, i32) -> i32
+fn min_c73147() {
+  var res: i32 = min(1, 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_c73147();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_c73147();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_c73147();
+}
diff --git a/test/tint/builtins/gen/min/c73147.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/c73147.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/c73147.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/c73147.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/c73147.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/c73147.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/c73147.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/c73147.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/c73147.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/c73147.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/c73147.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/c73147.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/c73147.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/c73147.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/c73147.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/c73147.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/c73147.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/c73147.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/c73147.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/c73147.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/min/c76fa6.wgsl b/test/tint/builtins/gen/literal/min/c76fa6.wgsl
new file mode 100644
index 0000000..a696f37
--- /dev/null
+++ b/test/tint/builtins/gen/literal/min/c76fa6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn min(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn min_c76fa6() {
+  var res: vec4<f32> = min(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  min_c76fa6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  min_c76fa6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  min_c76fa6();
+}
diff --git a/test/tint/builtins/gen/min/c76fa6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/min/c76fa6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/min/c76fa6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/min/c76fa6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/min/c76fa6.wgsl.expected.msl b/test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/min/c76fa6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/min/c76fa6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/min/c76fa6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/min/c76fa6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/min/c76fa6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/min/c76fa6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/0c8c33.wgsl b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl
new file mode 100644
index 0000000..b6c3b90
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn mix_0c8c33() {
+  var res: vec3<f32> = mix(vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_0c8c33();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_0c8c33();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_0c8c33();
+}
diff --git a/test/tint/builtins/gen/mix/0c8c33.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/0c8c33.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/0c8c33.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/0c8c33.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/0c8c33.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/0c8c33.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/0c8c33.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/0c8c33.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/0c8c33.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/0c8c33.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/0c8c33.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/1faeb1.wgsl b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl
new file mode 100644
index 0000000..bf90b08
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(vec<4, f32>, vec<4, f32>, f32) -> vec<4, f32>
+fn mix_1faeb1() {
+  var res: vec4<f32> = mix(vec4<f32>(), vec4<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_1faeb1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_1faeb1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_1faeb1();
+}
diff --git a/test/tint/builtins/gen/mix/1faeb1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/1faeb1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/1faeb1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/1faeb1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/1faeb1.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/1faeb1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/1faeb1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/1faeb1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/1faeb1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/1faeb1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/1faeb1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/2fadab.wgsl b/test/tint/builtins/gen/literal/mix/2fadab.wgsl
new file mode 100644
index 0000000..175c4ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/2fadab.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(vec<2, f32>, vec<2, f32>, f32) -> vec<2, f32>
+fn mix_2fadab() {
+  var res: vec2<f32> = mix(vec2<f32>(), vec2<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_2fadab();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_2fadab();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_2fadab();
+}
diff --git a/test/tint/builtins/gen/mix/2fadab.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/2fadab.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/2fadab.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/2fadab.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/2fadab.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/2fadab.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/2fadab.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/2fadab.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/2fadab.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/2fadab.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/2fadab.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/315264.wgsl b/test/tint/builtins/gen/literal/mix/315264.wgsl
new file mode 100644
index 0000000..0e8b9db
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/315264.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(vec<3, f32>, vec<3, f32>, f32) -> vec<3, f32>
+fn mix_315264() {
+  var res: vec3<f32> = mix(vec3<f32>(), vec3<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_315264();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_315264();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_315264();
+}
diff --git a/test/tint/builtins/gen/mix/315264.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/315264.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/315264.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/315264.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/315264.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/315264.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/315264.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/315264.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/315264.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/315264.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/315264.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/315264.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/315264.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/315264.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/315264.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/315264.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/315264.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/315264.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/315264.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/315264.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl
new file mode 100644
index 0000000..f959131
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(f32, f32, f32) -> f32
+fn mix_4f0b5e() {
+  var res: f32 = mix(1.0, 1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_4f0b5e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_4f0b5e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_4f0b5e();
+}
diff --git a/test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/4f0b5e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/4f0b5e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/6f8adc.wgsl b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl
new file mode 100644
index 0000000..d95c6dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn mix_6f8adc() {
+  var res: vec2<f32> = mix(vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_6f8adc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_6f8adc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_6f8adc();
+}
diff --git a/test/tint/builtins/gen/mix/6f8adc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/6f8adc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/6f8adc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/6f8adc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/6f8adc.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/6f8adc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/6f8adc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/6f8adc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/6f8adc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/6f8adc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/6f8adc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/mix/c37ede.wgsl b/test/tint/builtins/gen/literal/mix/c37ede.wgsl
new file mode 100644
index 0000000..4c28c9b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/mix/c37ede.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn mix(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn mix_c37ede() {
+  var res: vec4<f32> = mix(vec4<f32>(), vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  mix_c37ede();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  mix_c37ede();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  mix_c37ede();
+}
diff --git a/test/tint/builtins/gen/mix/c37ede.wgsl.expected.glsl b/test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/mix/c37ede.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/mix/c37ede.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/mix/c37ede.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/mix/c37ede.wgsl.expected.msl b/test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/mix/c37ede.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/mix/c37ede.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/mix/c37ede.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/mix/c37ede.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/mix/c37ede.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/mix/c37ede.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/modf/180fed.wgsl b/test/tint/builtins/gen/literal/modf/180fed.wgsl
new file mode 100644
index 0000000..64fb940
--- /dev/null
+++ b/test/tint/builtins/gen/literal/modf/180fed.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(f32) -> __modf_result
+fn modf_180fed() {
+  var res = modf(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  modf_180fed();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  modf_180fed();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  modf_180fed();
+}
diff --git a/test/tint/builtins/gen/modf/180fed.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/modf/180fed.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/modf/180fed.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/modf/180fed.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/modf/180fed.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/modf/180fed.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/modf/180fed.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/modf/180fed.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/modf/180fed.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/modf/180fed.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/modf/180fed.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/modf/9b75f7.wgsl b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl
new file mode 100644
index 0000000..514c345
--- /dev/null
+++ b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(vec<3, f32>) -> __modf_result_vec<3>
+fn modf_9b75f7() {
+  var res = modf(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  modf_9b75f7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  modf_9b75f7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  modf_9b75f7();
+}
diff --git a/test/tint/builtins/gen/modf/9b75f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/modf/9b75f7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/modf/9b75f7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/modf/9b75f7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/modf/9b75f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/modf/9b75f7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/modf/9b75f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/modf/9b75f7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/modf/9b75f7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/modf/9b75f7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/modf/9b75f7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl
new file mode 100644
index 0000000..175dd84
--- /dev/null
+++ b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(vec<4, f32>) -> __modf_result_vec<4>
+fn modf_ec2dbc() {
+  var res = modf(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  modf_ec2dbc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  modf_ec2dbc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  modf_ec2dbc();
+}
diff --git a/test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/modf/ec2dbc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/modf/ec2dbc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/modf/f5f20d.wgsl b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl
new file mode 100644
index 0000000..e3b3bec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(vec<2, f32>) -> __modf_result_vec<2>
+fn modf_f5f20d() {
+  var res = modf(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  modf_f5f20d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  modf_f5f20d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  modf_f5f20d();
+}
diff --git a/test/tint/builtins/gen/modf/f5f20d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/modf/f5f20d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/modf/f5f20d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/modf/f5f20d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/modf/f5f20d.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/modf/f5f20d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/modf/f5f20d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/modf/f5f20d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/modf/f5f20d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/modf/f5f20d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/modf/f5f20d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl
new file mode 100644
index 0000000..78db9df
--- /dev/null
+++ b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn normalize(vec<3, f32>) -> vec<3, f32>
+fn normalize_64d8c0() {
+  var res: vec3<f32> = normalize(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  normalize_64d8c0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  normalize_64d8c0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  normalize_64d8c0();
+}
diff --git a/test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.msl b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/64d8c0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/normalize/64d8c0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl
new file mode 100644
index 0000000..8c041ad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn normalize(vec<4, f32>) -> vec<4, f32>
+fn normalize_9a0aab() {
+  var res: vec4<f32> = normalize(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  normalize_9a0aab();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  normalize_9a0aab();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  normalize_9a0aab();
+}
diff --git a/test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.glsl b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.msl b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/9a0aab.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/normalize/9a0aab.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl
new file mode 100644
index 0000000..83c1605
--- /dev/null
+++ b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn normalize(vec<2, f32>) -> vec<2, f32>
+fn normalize_fc2ef1() {
+  var res: vec2<f32> = normalize(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  normalize_fc2ef1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  normalize_fc2ef1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  normalize_fc2ef1();
+}
diff --git a/test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.msl b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/normalize/fc2ef1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/normalize/fc2ef1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl
new file mode 100644
index 0000000..2f2d664
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pack2x16float(vec2<f32>) -> u32
+fn pack2x16float_0e97b3() {
+  var res: u32 = pack2x16float(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pack2x16float_0e97b3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pack2x16float_0e97b3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pack2x16float_0e97b3();
+}
diff --git a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.msl b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16float/0e97b3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pack2x16float/0e97b3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl
new file mode 100644
index 0000000..980f6f3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pack2x16snorm(vec2<f32>) -> u32
+fn pack2x16snorm_6c169b() {
+  var res: u32 = pack2x16snorm(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pack2x16snorm_6c169b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pack2x16snorm_6c169b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pack2x16snorm_6c169b();
+}
diff --git a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.msl b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pack2x16snorm/6c169b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl
new file mode 100644
index 0000000..1e44323
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pack2x16unorm(vec2<f32>) -> u32
+fn pack2x16unorm_0f08e4() {
+  var res: u32 = pack2x16unorm(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pack2x16unorm_0f08e4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pack2x16unorm_0f08e4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pack2x16unorm_0f08e4();
+}
diff --git a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.msl b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pack2x16unorm/0f08e4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl
new file mode 100644
index 0000000..97c44f9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pack4x8snorm(vec4<f32>) -> u32
+fn pack4x8snorm_4d22e7() {
+  var res: u32 = pack4x8snorm(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pack4x8snorm_4d22e7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pack4x8snorm_4d22e7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pack4x8snorm_4d22e7();
+}
diff --git a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.msl b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pack4x8snorm/4d22e7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl
new file mode 100644
index 0000000..8f242ba
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pack4x8unorm(vec4<f32>) -> u32
+fn pack4x8unorm_95c456() {
+  var res: u32 = pack4x8unorm(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pack4x8unorm_95c456();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pack4x8unorm_95c456();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pack4x8unorm_95c456();
+}
diff --git a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.msl b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pack4x8unorm/95c456.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pack4x8unorm/95c456.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pow/04a908.wgsl b/test/tint/builtins/gen/literal/pow/04a908.wgsl
new file mode 100644
index 0000000..5371847
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pow/04a908.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pow(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn pow_04a908() {
+  var res: vec4<f32> = pow(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pow_04a908();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pow_04a908();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pow_04a908();
+}
diff --git a/test/tint/builtins/gen/pow/04a908.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pow/04a908.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pow/04a908.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pow/04a908.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pow/04a908.wgsl.expected.msl b/test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pow/04a908.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pow/04a908.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pow/04a908.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pow/04a908.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pow/04a908.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pow/04a908.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pow/46e029.wgsl b/test/tint/builtins/gen/literal/pow/46e029.wgsl
new file mode 100644
index 0000000..16241f6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pow/46e029.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pow(f32, f32) -> f32
+fn pow_46e029() {
+  var res: f32 = pow(1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pow_46e029();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pow_46e029();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pow_46e029();
+}
diff --git a/test/tint/builtins/gen/pow/46e029.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pow/46e029.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pow/46e029.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pow/46e029.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pow/46e029.wgsl.expected.msl b/test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pow/46e029.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pow/46e029.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pow/46e029.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pow/46e029.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pow/46e029.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pow/46e029.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pow/4a46c9.wgsl b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl
new file mode 100644
index 0000000..58ceff0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pow(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn pow_4a46c9() {
+  var res: vec3<f32> = pow(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pow_4a46c9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pow_4a46c9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pow_4a46c9();
+}
diff --git a/test/tint/builtins/gen/pow/4a46c9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pow/4a46c9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pow/4a46c9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pow/4a46c9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pow/4a46c9.wgsl.expected.msl b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pow/4a46c9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pow/4a46c9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pow/4a46c9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pow/4a46c9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pow/4a46c9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pow/4a46c9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/pow/e60ea5.wgsl b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl
new file mode 100644
index 0000000..4939232
--- /dev/null
+++ b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn pow(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn pow_e60ea5() {
+  var res: vec2<f32> = pow(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  pow_e60ea5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  pow_e60ea5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  pow_e60ea5();
+}
diff --git a/test/tint/builtins/gen/pow/e60ea5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/pow/e60ea5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/pow/e60ea5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/pow/e60ea5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/pow/e60ea5.wgsl.expected.msl b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/pow/e60ea5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/pow/e60ea5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/pow/e60ea5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/pow/e60ea5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/pow/e60ea5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/pow/e60ea5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/radians/09b7fc.wgsl b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl
new file mode 100644
index 0000000..1bd0605
--- /dev/null
+++ b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn radians(vec<4, f32>) -> vec<4, f32>
+fn radians_09b7fc() {
+  var res: vec4<f32> = radians(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  radians_09b7fc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  radians_09b7fc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  radians_09b7fc();
+}
diff --git a/test/tint/builtins/gen/radians/09b7fc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/radians/09b7fc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/radians/09b7fc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/radians/09b7fc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/radians/09b7fc.wgsl.expected.msl b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/radians/09b7fc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/radians/09b7fc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/radians/09b7fc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/radians/09b7fc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/radians/09b7fc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/radians/09b7fc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/radians/61687a.wgsl b/test/tint/builtins/gen/literal/radians/61687a.wgsl
new file mode 100644
index 0000000..0b281ee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/radians/61687a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn radians(vec<2, f32>) -> vec<2, f32>
+fn radians_61687a() {
+  var res: vec2<f32> = radians(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  radians_61687a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  radians_61687a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  radians_61687a();
+}
diff --git a/test/tint/builtins/gen/radians/61687a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/radians/61687a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/radians/61687a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/radians/61687a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/radians/61687a.wgsl.expected.msl b/test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/radians/61687a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/radians/61687a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/radians/61687a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/radians/61687a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/radians/61687a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/radians/61687a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl
new file mode 100644
index 0000000..b4f4aa7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn radians(f32) -> f32
+fn radians_6b0ff2() {
+  var res: f32 = radians(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  radians_6b0ff2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  radians_6b0ff2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  radians_6b0ff2();
+}
diff --git a/test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.msl b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/radians/6b0ff2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/radians/6b0ff2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/radians/f96258.wgsl b/test/tint/builtins/gen/literal/radians/f96258.wgsl
new file mode 100644
index 0000000..e078695
--- /dev/null
+++ b/test/tint/builtins/gen/literal/radians/f96258.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn radians(vec<3, f32>) -> vec<3, f32>
+fn radians_f96258() {
+  var res: vec3<f32> = radians(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  radians_f96258();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  radians_f96258();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  radians_f96258();
+}
diff --git a/test/tint/builtins/gen/radians/f96258.wgsl.expected.glsl b/test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/radians/f96258.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/radians/f96258.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/radians/f96258.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/radians/f96258.wgsl.expected.msl b/test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/radians/f96258.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/radians/f96258.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/radians/f96258.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/radians/f96258.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/radians/f96258.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/radians/f96258.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reflect/05357e.wgsl b/test/tint/builtins/gen/literal/reflect/05357e.wgsl
new file mode 100644
index 0000000..7d26fdf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reflect/05357e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reflect(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn reflect_05357e() {
+  var res: vec4<f32> = reflect(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reflect_05357e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reflect_05357e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reflect_05357e();
+}
diff --git a/test/tint/builtins/gen/reflect/05357e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/05357e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reflect/05357e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/05357e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reflect/05357e.wgsl.expected.msl b/test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reflect/05357e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reflect/05357e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reflect/05357e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reflect/05357e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/05357e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reflect/05357e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reflect/b61e10.wgsl b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl
new file mode 100644
index 0000000..fa6215b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reflect(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn reflect_b61e10() {
+  var res: vec2<f32> = reflect(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reflect_b61e10();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reflect_b61e10();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reflect_b61e10();
+}
diff --git a/test/tint/builtins/gen/reflect/b61e10.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/b61e10.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reflect/b61e10.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/b61e10.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reflect/b61e10.wgsl.expected.msl b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reflect/b61e10.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reflect/b61e10.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reflect/b61e10.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reflect/b61e10.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/b61e10.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reflect/b61e10.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl
new file mode 100644
index 0000000..7ce4d2a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reflect(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn reflect_f47fdb() {
+  var res: vec3<f32> = reflect(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reflect_f47fdb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reflect_f47fdb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reflect_f47fdb();
+}
diff --git a/test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.msl b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reflect/f47fdb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reflect/f47fdb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/refract/7e02e6.wgsl b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl
new file mode 100644
index 0000000..24a7718
--- /dev/null
+++ b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn refract(vec<4, f32>, vec<4, f32>, f32) -> vec<4, f32>
+fn refract_7e02e6() {
+  var res: vec4<f32> = refract(vec4<f32>(), vec4<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  refract_7e02e6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  refract_7e02e6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  refract_7e02e6();
+}
diff --git a/test/tint/builtins/gen/refract/7e02e6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/refract/7e02e6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/refract/7e02e6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/refract/7e02e6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/refract/7e02e6.wgsl.expected.msl b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/refract/7e02e6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/refract/7e02e6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/refract/7e02e6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/refract/7e02e6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/refract/7e02e6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/refract/7e02e6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl
new file mode 100644
index 0000000..d30a12e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn refract(vec<3, f32>, vec<3, f32>, f32) -> vec<3, f32>
+fn refract_cbc1d2() {
+  var res: vec3<f32> = refract(vec3<f32>(), vec3<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  refract_cbc1d2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  refract_cbc1d2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  refract_cbc1d2();
+}
diff --git a/test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.msl b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/refract/cbc1d2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/refract/cbc1d2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/refract/cd905f.wgsl b/test/tint/builtins/gen/literal/refract/cd905f.wgsl
new file mode 100644
index 0000000..5d486b2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/refract/cd905f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn refract(vec<2, f32>, vec<2, f32>, f32) -> vec<2, f32>
+fn refract_cd905f() {
+  var res: vec2<f32> = refract(vec2<f32>(), vec2<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  refract_cd905f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  refract_cd905f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  refract_cd905f();
+}
diff --git a/test/tint/builtins/gen/refract/cd905f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/refract/cd905f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/refract/cd905f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/refract/cd905f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/refract/cd905f.wgsl.expected.msl b/test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/refract/cd905f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/refract/cd905f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/refract/cd905f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/refract/cd905f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/refract/cd905f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/refract/cd905f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/222177.wgsl b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl
new file mode 100644
index 0000000..3fb14c1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(vec<2, i32>) -> vec<2, i32>
+fn reverseBits_222177() {
+  var res: vec2<i32> = reverseBits(vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_222177();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_222177();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_222177();
+}
diff --git a/test/tint/builtins/gen/reverseBits/222177.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/222177.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/222177.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/222177.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/222177.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/222177.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/222177.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/222177.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/222177.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/222177.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/222177.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl
new file mode 100644
index 0000000..952fc11
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(vec<4, u32>) -> vec<4, u32>
+fn reverseBits_35fea9() {
+  var res: vec4<u32> = reverseBits(vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_35fea9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_35fea9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_35fea9();
+}
diff --git a/test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/35fea9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/35fea9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl
new file mode 100644
index 0000000..9aa9ef0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(vec<4, i32>) -> vec<4, i32>
+fn reverseBits_4dbd6f() {
+  var res: vec4<i32> = reverseBits(vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_4dbd6f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_4dbd6f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_4dbd6f();
+}
diff --git a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/4dbd6f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/4dbd6f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl
new file mode 100644
index 0000000..0f2b62f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(i32) -> i32
+fn reverseBits_7c4269() {
+  var res: i32 = reverseBits(1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_7c4269();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_7c4269();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_7c4269();
+}
diff --git a/test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/7c4269.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/7c4269.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl
new file mode 100644
index 0000000..9a312da
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(vec<3, u32>) -> vec<3, u32>
+fn reverseBits_a6ccd4() {
+  var res: vec3<u32> = reverseBits(vec3<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_a6ccd4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_a6ccd4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_a6ccd4();
+}
diff --git a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/a6ccd4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/a6ccd4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl
new file mode 100644
index 0000000..53ec0da
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(vec<3, i32>) -> vec<3, i32>
+fn reverseBits_c21bc1() {
+  var res: vec3<i32> = reverseBits(vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_c21bc1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_c21bc1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_c21bc1();
+}
diff --git a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/c21bc1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/c21bc1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl
new file mode 100644
index 0000000..d53c491
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(vec<2, u32>) -> vec<2, u32>
+fn reverseBits_e1f4c1() {
+  var res: vec2<u32> = reverseBits(vec2<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_e1f4c1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_e1f4c1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_e1f4c1();
+}
diff --git a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e1f4c1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/e1f4c1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl
new file mode 100644
index 0000000..3f4635e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn reverseBits(u32) -> u32
+fn reverseBits_e31adf() {
+  var res: u32 = reverseBits(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  reverseBits_e31adf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  reverseBits_e31adf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  reverseBits_e31adf();
+}
diff --git a/test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.msl b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/reverseBits/e31adf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/reverseBits/e31adf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/round/106c0b.wgsl b/test/tint/builtins/gen/literal/round/106c0b.wgsl
new file mode 100644
index 0000000..2bb4ab2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/round/106c0b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn round(vec<4, f32>) -> vec<4, f32>
+fn round_106c0b() {
+  var res: vec4<f32> = round(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  round_106c0b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  round_106c0b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  round_106c0b();
+}
diff --git a/test/tint/builtins/gen/round/106c0b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/round/106c0b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/round/106c0b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/round/106c0b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/round/106c0b.wgsl.expected.msl b/test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/round/106c0b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/round/106c0b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/round/106c0b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/round/106c0b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/round/106c0b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/round/106c0b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/round/1c7897.wgsl b/test/tint/builtins/gen/literal/round/1c7897.wgsl
new file mode 100644
index 0000000..14c38ca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/round/1c7897.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn round(vec<3, f32>) -> vec<3, f32>
+fn round_1c7897() {
+  var res: vec3<f32> = round(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  round_1c7897();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  round_1c7897();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  round_1c7897();
+}
diff --git a/test/tint/builtins/gen/round/1c7897.wgsl.expected.glsl b/test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/round/1c7897.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/round/1c7897.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/round/1c7897.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/round/1c7897.wgsl.expected.msl b/test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/round/1c7897.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/round/1c7897.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/round/1c7897.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/round/1c7897.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/round/1c7897.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/round/1c7897.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/round/52c84d.wgsl b/test/tint/builtins/gen/literal/round/52c84d.wgsl
new file mode 100644
index 0000000..e778028
--- /dev/null
+++ b/test/tint/builtins/gen/literal/round/52c84d.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn round(vec<2, f32>) -> vec<2, f32>
+fn round_52c84d() {
+  var res: vec2<f32> = round(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  round_52c84d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  round_52c84d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  round_52c84d();
+}
diff --git a/test/tint/builtins/gen/round/52c84d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/round/52c84d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/round/52c84d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/round/52c84d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/round/52c84d.wgsl.expected.msl b/test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/round/52c84d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/round/52c84d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/round/52c84d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/round/52c84d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/round/52c84d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/round/52c84d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/round/9edc38.wgsl b/test/tint/builtins/gen/literal/round/9edc38.wgsl
new file mode 100644
index 0000000..85f6a27
--- /dev/null
+++ b/test/tint/builtins/gen/literal/round/9edc38.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn round(f32) -> f32
+fn round_9edc38() {
+  var res: f32 = round(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  round_9edc38();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  round_9edc38();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  round_9edc38();
+}
diff --git a/test/tint/builtins/gen/round/9edc38.wgsl.expected.glsl b/test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/round/9edc38.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/round/9edc38.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/round/9edc38.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/round/9edc38.wgsl.expected.msl b/test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/round/9edc38.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/round/9edc38.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/round/9edc38.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/round/9edc38.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/round/9edc38.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/round/9edc38.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/00b848.wgsl b/test/tint/builtins/gen/literal/select/00b848.wgsl
new file mode 100644
index 0000000..a22201b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/00b848.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, i32>, vec<2, i32>, vec<2, bool>) -> vec<2, i32>
+fn select_00b848() {
+  var res: vec2<i32> = select(vec2<i32>(), vec2<i32>(), vec2<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_00b848();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_00b848();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_00b848();
+}
diff --git a/test/tint/builtins/gen/select/00b848.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/00b848.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/00b848.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/00b848.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/00b848.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/00b848.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/00b848.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/00b848.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/00b848.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/00b848.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/00b848.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/00b848.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/00b848.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/00b848.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/00b848.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/00b848.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/00b848.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/00b848.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/00b848.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/00b848.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/01e2cd.wgsl b/test/tint/builtins/gen/literal/select/01e2cd.wgsl
new file mode 100644
index 0000000..6fba1df
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/01e2cd.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, i32>, vec<3, i32>, vec<3, bool>) -> vec<3, i32>
+fn select_01e2cd() {
+  var res: vec3<i32> = select(vec3<i32>(), vec3<i32>(), vec3<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_01e2cd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_01e2cd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_01e2cd();
+}
diff --git a/test/tint/builtins/gen/select/01e2cd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/01e2cd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/01e2cd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/01e2cd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/01e2cd.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/01e2cd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/01e2cd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/01e2cd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/01e2cd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/01e2cd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/01e2cd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/087ea4.wgsl b/test/tint/builtins/gen/literal/select/087ea4.wgsl
new file mode 100644
index 0000000..2bc9d0a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/087ea4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, u32>, vec<4, u32>, bool) -> vec<4, u32>
+fn select_087ea4() {
+  var res: vec4<u32> = select(vec4<u32>(), vec4<u32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_087ea4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_087ea4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_087ea4();
+}
diff --git a/test/tint/builtins/gen/select/087ea4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/087ea4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/087ea4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/087ea4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/087ea4.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/087ea4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/087ea4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/087ea4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/087ea4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/087ea4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/087ea4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/1e960b.wgsl b/test/tint/builtins/gen/literal/select/1e960b.wgsl
new file mode 100644
index 0000000..650b9e4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/1e960b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, u32>, vec<2, u32>, vec<2, bool>) -> vec<2, u32>
+fn select_1e960b() {
+  var res: vec2<u32> = select(vec2<u32>(), vec2<u32>(), vec2<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_1e960b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_1e960b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_1e960b();
+}
diff --git a/test/tint/builtins/gen/select/1e960b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/1e960b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/1e960b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/1e960b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/1e960b.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/1e960b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/1e960b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/1e960b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/1e960b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/1e960b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/1e960b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/266aff.wgsl b/test/tint/builtins/gen/literal/select/266aff.wgsl
new file mode 100644
index 0000000..80d50b0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/266aff.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, f32>, vec<2, f32>, vec<2, bool>) -> vec<2, f32>
+fn select_266aff() {
+  var res: vec2<f32> = select(vec2<f32>(), vec2<f32>(), vec2<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_266aff();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_266aff();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_266aff();
+}
diff --git a/test/tint/builtins/gen/select/266aff.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/266aff.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/266aff.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/266aff.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/266aff.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/266aff.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/266aff.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/266aff.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/266aff.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/266aff.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/266aff.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/266aff.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/266aff.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/266aff.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/266aff.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/266aff.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/266aff.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/266aff.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/266aff.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/266aff.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/28a27e.wgsl b/test/tint/builtins/gen/literal/select/28a27e.wgsl
new file mode 100644
index 0000000..0837ea7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/28a27e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, u32>, vec<3, u32>, vec<3, bool>) -> vec<3, u32>
+fn select_28a27e() {
+  var res: vec3<u32> = select(vec3<u32>(), vec3<u32>(), vec3<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_28a27e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_28a27e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_28a27e();
+}
diff --git a/test/tint/builtins/gen/select/28a27e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/28a27e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/28a27e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/28a27e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/28a27e.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/28a27e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/28a27e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/28a27e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/28a27e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/28a27e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/28a27e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/3c25ce.wgsl b/test/tint/builtins/gen/literal/select/3c25ce.wgsl
new file mode 100644
index 0000000..e76b138
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/3c25ce.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, bool>, vec<3, bool>, bool) -> vec<3, bool>
+fn select_3c25ce() {
+  var res: vec3<bool> = select(vec3<bool>(), vec3<bool>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_3c25ce();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_3c25ce();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_3c25ce();
+}
diff --git a/test/tint/builtins/gen/select/3c25ce.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/3c25ce.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/3c25ce.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/3c25ce.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/3c25ce.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/3c25ce.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/3c25ce.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/3c25ce.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/3c25ce.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/3c25ce.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/3c25ce.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/416e14.wgsl b/test/tint/builtins/gen/literal/select/416e14.wgsl
new file mode 100644
index 0000000..32f3026
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/416e14.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(f32, f32, bool) -> f32
+fn select_416e14() {
+  var res: f32 = select(1.0, 1.0, bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_416e14();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_416e14();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_416e14();
+}
diff --git a/test/tint/builtins/gen/select/416e14.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/416e14.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/416e14.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/416e14.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/416e14.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/416e14.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/416e14.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/416e14.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/416e14.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/416e14.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/416e14.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/416e14.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/416e14.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/416e14.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/416e14.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/416e14.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/416e14.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/416e14.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/416e14.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/416e14.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/51b047.wgsl b/test/tint/builtins/gen/literal/select/51b047.wgsl
new file mode 100644
index 0000000..c30d299
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/51b047.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, u32>, vec<2, u32>, bool) -> vec<2, u32>
+fn select_51b047() {
+  var res: vec2<u32> = select(vec2<u32>(), vec2<u32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_51b047();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_51b047();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_51b047();
+}
diff --git a/test/tint/builtins/gen/select/51b047.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/51b047.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/51b047.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/51b047.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/51b047.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/51b047.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/51b047.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/51b047.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/51b047.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/51b047.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/51b047.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/51b047.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/51b047.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/51b047.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/51b047.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/51b047.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/51b047.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/51b047.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/51b047.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/51b047.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/713567.wgsl b/test/tint/builtins/gen/literal/select/713567.wgsl
new file mode 100644
index 0000000..633b85b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/713567.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, f32>, vec<4, f32>, bool) -> vec<4, f32>
+fn select_713567() {
+  var res: vec4<f32> = select(vec4<f32>(), vec4<f32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_713567();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_713567();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_713567();
+}
diff --git a/test/tint/builtins/gen/select/713567.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/713567.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/713567.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/713567.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/713567.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/713567.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/713567.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/713567.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/713567.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/713567.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/713567.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/713567.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/713567.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/713567.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/713567.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/713567.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/713567.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/713567.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/713567.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/713567.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/78be5f.wgsl b/test/tint/builtins/gen/literal/select/78be5f.wgsl
new file mode 100644
index 0000000..08ffe22
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/78be5f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, f32>, vec<3, f32>, bool) -> vec<3, f32>
+fn select_78be5f() {
+  var res: vec3<f32> = select(vec3<f32>(), vec3<f32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_78be5f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_78be5f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_78be5f();
+}
diff --git a/test/tint/builtins/gen/select/78be5f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/78be5f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/78be5f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/78be5f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/78be5f.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/78be5f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/78be5f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/78be5f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/78be5f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/78be5f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/78be5f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/80a9a9.wgsl b/test/tint/builtins/gen/literal/select/80a9a9.wgsl
new file mode 100644
index 0000000..ce846af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/80a9a9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, bool>, vec<3, bool>, vec<3, bool>) -> vec<3, bool>
+fn select_80a9a9() {
+  var res: vec3<bool> = select(vec3<bool>(), vec3<bool>(), vec3<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_80a9a9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_80a9a9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_80a9a9();
+}
diff --git a/test/tint/builtins/gen/select/80a9a9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/80a9a9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/80a9a9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/80a9a9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/80a9a9.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/80a9a9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/80a9a9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/80a9a9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/80a9a9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/80a9a9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/80a9a9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/8fa62c.wgsl b/test/tint/builtins/gen/literal/select/8fa62c.wgsl
new file mode 100644
index 0000000..2033877
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/8fa62c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, i32>, vec<3, i32>, bool) -> vec<3, i32>
+fn select_8fa62c() {
+  var res: vec3<i32> = select(vec3<i32>(), vec3<i32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_8fa62c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_8fa62c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_8fa62c();
+}
diff --git a/test/tint/builtins/gen/select/8fa62c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/8fa62c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/8fa62c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/8fa62c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/8fa62c.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/8fa62c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/8fa62c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/8fa62c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/8fa62c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/8fa62c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/8fa62c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/99f883.wgsl b/test/tint/builtins/gen/literal/select/99f883.wgsl
new file mode 100644
index 0000000..c501388
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/99f883.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(u32, u32, bool) -> u32
+fn select_99f883() {
+  var res: u32 = select(1u, 1u, bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_99f883();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_99f883();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_99f883();
+}
diff --git a/test/tint/builtins/gen/select/99f883.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/99f883.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/99f883.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/99f883.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/99f883.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/99f883.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/99f883.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/99f883.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/99f883.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/99f883.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/99f883.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/99f883.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/99f883.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/99f883.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/99f883.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/99f883.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/99f883.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/99f883.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/99f883.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/99f883.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/a2860e.wgsl b/test/tint/builtins/gen/literal/select/a2860e.wgsl
new file mode 100644
index 0000000..7d284e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/a2860e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, i32>, vec<4, i32>, vec<4, bool>) -> vec<4, i32>
+fn select_a2860e() {
+  var res: vec4<i32> = select(vec4<i32>(), vec4<i32>(), vec4<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_a2860e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_a2860e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_a2860e();
+}
diff --git a/test/tint/builtins/gen/select/a2860e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/a2860e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/a2860e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/a2860e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/a2860e.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/a2860e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/a2860e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/a2860e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/a2860e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/a2860e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/a2860e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/ab069f.wgsl b/test/tint/builtins/gen/literal/select/ab069f.wgsl
new file mode 100644
index 0000000..b806234
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/ab069f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, i32>, vec<4, i32>, bool) -> vec<4, i32>
+fn select_ab069f() {
+  var res: vec4<i32> = select(vec4<i32>(), vec4<i32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_ab069f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_ab069f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_ab069f();
+}
diff --git a/test/tint/builtins/gen/select/ab069f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/ab069f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/ab069f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/ab069f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/ab069f.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/ab069f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/ab069f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/ab069f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/ab069f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/ab069f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/ab069f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/b04721.wgsl b/test/tint/builtins/gen/literal/select/b04721.wgsl
new file mode 100644
index 0000000..d0b5455
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/b04721.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, u32>, vec<3, u32>, bool) -> vec<3, u32>
+fn select_b04721() {
+  var res: vec3<u32> = select(vec3<u32>(), vec3<u32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_b04721();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_b04721();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_b04721();
+}
diff --git a/test/tint/builtins/gen/select/b04721.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/b04721.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/b04721.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/b04721.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/b04721.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/b04721.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/b04721.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/b04721.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/b04721.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/b04721.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/b04721.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/b04721.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/b04721.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/b04721.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/b04721.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/b04721.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/b04721.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/b04721.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/b04721.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/b04721.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/bb447f.wgsl b/test/tint/builtins/gen/literal/select/bb447f.wgsl
new file mode 100644
index 0000000..efaac74
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/bb447f.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, i32>, vec<2, i32>, bool) -> vec<2, i32>
+fn select_bb447f() {
+  var res: vec2<i32> = select(vec2<i32>(), vec2<i32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_bb447f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_bb447f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_bb447f();
+}
diff --git a/test/tint/builtins/gen/select/bb447f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/bb447f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/bb447f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/bb447f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/bb447f.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/bb447f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/bb447f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/bb447f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/bb447f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/bb447f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/bb447f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/bb8aae.wgsl b/test/tint/builtins/gen/literal/select/bb8aae.wgsl
new file mode 100644
index 0000000..f728370
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/bb8aae.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, f32>, vec<4, f32>, vec<4, bool>) -> vec<4, f32>
+fn select_bb8aae() {
+  var res: vec4<f32> = select(vec4<f32>(), vec4<f32>(), vec4<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_bb8aae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_bb8aae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_bb8aae();
+}
diff --git a/test/tint/builtins/gen/select/bb8aae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/bb8aae.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/bb8aae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/bb8aae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/bb8aae.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/bb8aae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/bb8aae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/bb8aae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/bb8aae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/bb8aae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/bb8aae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/bf3d29.wgsl b/test/tint/builtins/gen/literal/select/bf3d29.wgsl
new file mode 100644
index 0000000..e841aa4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/bf3d29.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, f32>, vec<2, f32>, bool) -> vec<2, f32>
+fn select_bf3d29() {
+  var res: vec2<f32> = select(vec2<f32>(), vec2<f32>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_bf3d29();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_bf3d29();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_bf3d29();
+}
diff --git a/test/tint/builtins/gen/select/bf3d29.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/bf3d29.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/bf3d29.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/bf3d29.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/bf3d29.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/bf3d29.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/bf3d29.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/bf3d29.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/bf3d29.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/bf3d29.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/bf3d29.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/c31f9e.wgsl b/test/tint/builtins/gen/literal/select/c31f9e.wgsl
new file mode 100644
index 0000000..a4b50a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/c31f9e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(bool, bool, bool) -> bool
+fn select_c31f9e() {
+  var res: bool = select(bool(), bool(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_c31f9e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_c31f9e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_c31f9e();
+}
diff --git a/test/tint/builtins/gen/select/c31f9e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/c31f9e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/c31f9e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/c31f9e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/c31f9e.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/c31f9e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/c31f9e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/c31f9e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/c31f9e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/c31f9e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/c31f9e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/c41bd1.wgsl b/test/tint/builtins/gen/literal/select/c41bd1.wgsl
new file mode 100644
index 0000000..259ac4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/c41bd1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, bool>, vec<4, bool>, bool) -> vec<4, bool>
+fn select_c41bd1() {
+  var res: vec4<bool> = select(vec4<bool>(), vec4<bool>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_c41bd1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_c41bd1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_c41bd1();
+}
diff --git a/test/tint/builtins/gen/select/c41bd1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/c41bd1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/c41bd1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/c41bd1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/c41bd1.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/c41bd1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/c41bd1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/c41bd1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/c41bd1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/c41bd1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/c41bd1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/c4a4ef.wgsl b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl
new file mode 100644
index 0000000..09e1e82
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, u32>, vec<4, u32>, vec<4, bool>) -> vec<4, u32>
+fn select_c4a4ef() {
+  var res: vec4<u32> = select(vec4<u32>(), vec4<u32>(), vec4<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_c4a4ef();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_c4a4ef();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_c4a4ef();
+}
diff --git a/test/tint/builtins/gen/select/c4a4ef.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/c4a4ef.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/c4a4ef.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/c4a4ef.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/c4a4ef.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/c4a4ef.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/c4a4ef.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/c4a4ef.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/c4a4ef.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/c4a4ef.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/c4a4ef.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/cb9301.wgsl b/test/tint/builtins/gen/literal/select/cb9301.wgsl
new file mode 100644
index 0000000..6a18667
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/cb9301.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, bool>, vec<2, bool>, vec<2, bool>) -> vec<2, bool>
+fn select_cb9301() {
+  var res: vec2<bool> = select(vec2<bool>(), vec2<bool>(), vec2<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_cb9301();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_cb9301();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_cb9301();
+}
diff --git a/test/tint/builtins/gen/select/cb9301.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/cb9301.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/cb9301.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/cb9301.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/cb9301.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/cb9301.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/cb9301.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/cb9301.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/cb9301.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/cb9301.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/cb9301.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/e3e028.wgsl b/test/tint/builtins/gen/literal/select/e3e028.wgsl
new file mode 100644
index 0000000..60b9de6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/e3e028.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<4, bool>, vec<4, bool>, vec<4, bool>) -> vec<4, bool>
+fn select_e3e028() {
+  var res: vec4<bool> = select(vec4<bool>(), vec4<bool>(), vec4<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_e3e028();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_e3e028();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_e3e028();
+}
diff --git a/test/tint/builtins/gen/select/e3e028.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/e3e028.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/e3e028.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/e3e028.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/e3e028.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/e3e028.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/e3e028.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/e3e028.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/e3e028.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/e3e028.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/e3e028.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/ebfea2.wgsl b/test/tint/builtins/gen/literal/select/ebfea2.wgsl
new file mode 100644
index 0000000..f67652e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/ebfea2.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<3, f32>, vec<3, f32>, vec<3, bool>) -> vec<3, f32>
+fn select_ebfea2() {
+  var res: vec3<f32> = select(vec3<f32>(), vec3<f32>(), vec3<bool>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_ebfea2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_ebfea2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_ebfea2();
+}
diff --git a/test/tint/builtins/gen/select/ebfea2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/ebfea2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/ebfea2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/ebfea2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/ebfea2.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/ebfea2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/ebfea2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/ebfea2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/ebfea2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/ebfea2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/ebfea2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/ed8a15.wgsl b/test/tint/builtins/gen/literal/select/ed8a15.wgsl
new file mode 100644
index 0000000..f51a5f5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/ed8a15.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(i32, i32, bool) -> i32
+fn select_ed8a15() {
+  var res: i32 = select(1, 1, bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_ed8a15();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_ed8a15();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_ed8a15();
+}
diff --git a/test/tint/builtins/gen/select/ed8a15.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/ed8a15.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/ed8a15.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/ed8a15.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/ed8a15.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/ed8a15.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/ed8a15.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/ed8a15.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/ed8a15.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/ed8a15.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/ed8a15.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/select/fb7e53.wgsl b/test/tint/builtins/gen/literal/select/fb7e53.wgsl
new file mode 100644
index 0000000..a0bffa8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/select/fb7e53.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn select(vec<2, bool>, vec<2, bool>, bool) -> vec<2, bool>
+fn select_fb7e53() {
+  var res: vec2<bool> = select(vec2<bool>(), vec2<bool>(), bool());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  select_fb7e53();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  select_fb7e53();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  select_fb7e53();
+}
diff --git a/test/tint/builtins/gen/select/fb7e53.wgsl.expected.glsl b/test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/select/fb7e53.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/select/fb7e53.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/select/fb7e53.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/select/fb7e53.wgsl.expected.msl b/test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/select/fb7e53.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/select/fb7e53.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/select/fb7e53.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/select/fb7e53.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/select/fb7e53.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/select/fb7e53.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sign/159665.wgsl b/test/tint/builtins/gen/literal/sign/159665.wgsl
new file mode 100644
index 0000000..2c3bd1b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sign/159665.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sign(vec<3, f32>) -> vec<3, f32>
+fn sign_159665() {
+  var res: vec3<f32> = sign(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sign_159665();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sign_159665();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sign_159665();
+}
diff --git a/test/tint/builtins/gen/sign/159665.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sign/159665.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sign/159665.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sign/159665.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sign/159665.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sign/159665.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sign/159665.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sign/159665.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sign/159665.wgsl.expected.msl b/test/tint/builtins/gen/literal/sign/159665.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sign/159665.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sign/159665.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sign/159665.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sign/159665.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sign/159665.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sign/159665.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sign/159665.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sign/159665.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sign/159665.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sign/159665.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sign/b8f634.wgsl b/test/tint/builtins/gen/literal/sign/b8f634.wgsl
new file mode 100644
index 0000000..ae50e74
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sign/b8f634.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sign(vec<4, f32>) -> vec<4, f32>
+fn sign_b8f634() {
+  var res: vec4<f32> = sign(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sign_b8f634();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sign_b8f634();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sign_b8f634();
+}
diff --git a/test/tint/builtins/gen/sign/b8f634.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sign/b8f634.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sign/b8f634.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sign/b8f634.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sign/b8f634.wgsl.expected.msl b/test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sign/b8f634.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sign/b8f634.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sign/b8f634.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sign/b8f634.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sign/b8f634.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sign/b8f634.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sign/d065d8.wgsl b/test/tint/builtins/gen/literal/sign/d065d8.wgsl
new file mode 100644
index 0000000..954aa60
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sign/d065d8.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sign(vec<2, f32>) -> vec<2, f32>
+fn sign_d065d8() {
+  var res: vec2<f32> = sign(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sign_d065d8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sign_d065d8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sign_d065d8();
+}
diff --git a/test/tint/builtins/gen/sign/d065d8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sign/d065d8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sign/d065d8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sign/d065d8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sign/d065d8.wgsl.expected.msl b/test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sign/d065d8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sign/d065d8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sign/d065d8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sign/d065d8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sign/d065d8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sign/d065d8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sign/dd790e.wgsl b/test/tint/builtins/gen/literal/sign/dd790e.wgsl
new file mode 100644
index 0000000..06c50c9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sign/dd790e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sign(f32) -> f32
+fn sign_dd790e() {
+  var res: f32 = sign(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sign_dd790e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sign_dd790e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sign_dd790e();
+}
diff --git a/test/tint/builtins/gen/sign/dd790e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sign/dd790e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sign/dd790e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sign/dd790e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sign/dd790e.wgsl.expected.msl b/test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sign/dd790e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sign/dd790e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sign/dd790e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sign/dd790e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sign/dd790e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sign/dd790e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sin/01f241.wgsl b/test/tint/builtins/gen/literal/sin/01f241.wgsl
new file mode 100644
index 0000000..967e7c0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sin/01f241.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sin(vec<3, f32>) -> vec<3, f32>
+fn sin_01f241() {
+  var res: vec3<f32> = sin(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sin_01f241();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sin_01f241();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sin_01f241();
+}
diff --git a/test/tint/builtins/gen/sin/01f241.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sin/01f241.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sin/01f241.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sin/01f241.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sin/01f241.wgsl.expected.msl b/test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sin/01f241.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sin/01f241.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sin/01f241.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sin/01f241.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sin/01f241.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sin/01f241.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sin/4e3979.wgsl b/test/tint/builtins/gen/literal/sin/4e3979.wgsl
new file mode 100644
index 0000000..cde754f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sin/4e3979.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sin(vec<4, f32>) -> vec<4, f32>
+fn sin_4e3979() {
+  var res: vec4<f32> = sin(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sin_4e3979();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sin_4e3979();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sin_4e3979();
+}
diff --git a/test/tint/builtins/gen/sin/4e3979.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sin/4e3979.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sin/4e3979.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sin/4e3979.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sin/4e3979.wgsl.expected.msl b/test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sin/4e3979.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sin/4e3979.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sin/4e3979.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sin/4e3979.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sin/4e3979.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sin/4e3979.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sin/b78c91.wgsl b/test/tint/builtins/gen/literal/sin/b78c91.wgsl
new file mode 100644
index 0000000..7a2120a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sin/b78c91.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sin(f32) -> f32
+fn sin_b78c91() {
+  var res: f32 = sin(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sin_b78c91();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sin_b78c91();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sin_b78c91();
+}
diff --git a/test/tint/builtins/gen/sin/b78c91.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sin/b78c91.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sin/b78c91.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sin/b78c91.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sin/b78c91.wgsl.expected.msl b/test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sin/b78c91.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sin/b78c91.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sin/b78c91.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sin/b78c91.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sin/b78c91.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sin/b78c91.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl
new file mode 100644
index 0000000..0888f2e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sin(vec<2, f32>) -> vec<2, f32>
+fn sin_fc8bc4() {
+  var res: vec2<f32> = sin(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sin_fc8bc4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sin_fc8bc4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sin_fc8bc4();
+}
diff --git a/test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.msl b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sin/fc8bc4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sin/fc8bc4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sinh/445e33.wgsl b/test/tint/builtins/gen/literal/sinh/445e33.wgsl
new file mode 100644
index 0000000..6ddbf4f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sinh/445e33.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sinh(vec<4, f32>) -> vec<4, f32>
+fn sinh_445e33() {
+  var res: vec4<f32> = sinh(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sinh_445e33();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sinh_445e33();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sinh_445e33();
+}
diff --git a/test/tint/builtins/gen/sinh/445e33.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/445e33.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sinh/445e33.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/445e33.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sinh/445e33.wgsl.expected.msl b/test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sinh/445e33.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sinh/445e33.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sinh/445e33.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sinh/445e33.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/445e33.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sinh/445e33.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sinh/7bb598.wgsl b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl
new file mode 100644
index 0000000..e45c7f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sinh(f32) -> f32
+fn sinh_7bb598() {
+  var res: f32 = sinh(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sinh_7bb598();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sinh_7bb598();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sinh_7bb598();
+}
diff --git a/test/tint/builtins/gen/sinh/7bb598.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/7bb598.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sinh/7bb598.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/7bb598.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sinh/7bb598.wgsl.expected.msl b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sinh/7bb598.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sinh/7bb598.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sinh/7bb598.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sinh/7bb598.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/7bb598.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sinh/7bb598.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sinh/b9860e.wgsl b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl
new file mode 100644
index 0000000..e913cb91
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sinh(vec<2, f32>) -> vec<2, f32>
+fn sinh_b9860e() {
+  var res: vec2<f32> = sinh(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sinh_b9860e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sinh_b9860e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sinh_b9860e();
+}
diff --git a/test/tint/builtins/gen/sinh/b9860e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/b9860e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sinh/b9860e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/b9860e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sinh/b9860e.wgsl.expected.msl b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sinh/b9860e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sinh/b9860e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sinh/b9860e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sinh/b9860e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/b9860e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sinh/b9860e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl
new file mode 100644
index 0000000..1ec2a5b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sinh(vec<3, f32>) -> vec<3, f32>
+fn sinh_c9a5eb() {
+  var res: vec3<f32> = sinh(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sinh_c9a5eb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sinh_c9a5eb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sinh_c9a5eb();
+}
diff --git a/test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.msl b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sinh/c9a5eb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sinh/c9a5eb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl
new file mode 100644
index 0000000..9df76b3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn smoothstep(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn smoothstep_392c19() {
+  var res: vec2<f32> = smoothstep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothstep_392c19();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothstep_392c19();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothstep_392c19();
+}
diff --git a/test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/392c19.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/392c19.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl
new file mode 100644
index 0000000..2989f50
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn smoothstep(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn smoothstep_40864c() {
+  var res: vec4<f32> = smoothstep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothstep_40864c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothstep_40864c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothstep_40864c();
+}
diff --git a/test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/40864c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/40864c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/smoothstep/5f615b.wgsl b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/5f615b.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.glsl
new file mode 100644
index 0000000..ea38d87
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.glsl
@@ -0,0 +1,53 @@
+builtins/gen/literal/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+                       ^^^^^^^^^^
+
+#version 310 es
+
+void smoothStep_5f615b() {
+  vec4 res = smoothstep(vec4(0.0f), vec4(0.0f), vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  smoothStep_5f615b();
+  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;
+
+void smoothStep_5f615b() {
+  vec4 res = smoothstep(vec4(0.0f), vec4(0.0f), vec4(0.0f));
+}
+
+void fragment_main() {
+  smoothStep_5f615b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+#version 310 es
+
+void smoothStep_5f615b() {
+  vec4 res = smoothstep(vec4(0.0f), vec4(0.0f), vec4(0.0f));
+}
+
+void compute_main() {
+  smoothStep_5f615b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.hlsl
new file mode 100644
index 0000000..56e0723
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+builtins/gen/literal/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+                       ^^^^^^^^^^
+
+void smoothStep_5f615b() {
+  float4 res = smoothstep((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+float4 vertex_main_inner() {
+  smoothStep_5f615b();
+  return (0.0f).xxxx;
+}
+
+tint_symbol vertex_main() {
+  const float4 inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = (tint_symbol)0;
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+void fragment_main() {
+  smoothStep_5f615b();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  smoothStep_5f615b();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.msl
new file mode 100644
index 0000000..58d65be
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.msl
@@ -0,0 +1,37 @@
+builtins/gen/literal/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+                       ^^^^^^^^^^
+
+#include <metal_stdlib>
+
+using namespace metal;
+void smoothStep_5f615b() {
+  float4 res = smoothstep(float4(0.0f), float4(0.0f), float4(0.0f));
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+float4 vertex_main_inner() {
+  smoothStep_5f615b();
+  return float4(0.0f);
+}
+
+vertex tint_symbol vertex_main() {
+  float4 const inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+fragment void fragment_main() {
+  smoothStep_5f615b();
+  return;
+}
+
+kernel void compute_main() {
+  smoothStep_5f615b();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.spvasm
new file mode 100644
index 0000000..ec41447
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+builtins/gen/literal/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+                       ^^^^^^^^^^
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+         %14 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %value "value"
+               OpName %vertex_point_size "vertex_point_size"
+               OpName %smoothStep_5f615b "smoothStep_5f615b"
+               OpName %res "res"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %value BuiltIn Position
+               OpDecorate %vertex_point_size BuiltIn PointSize
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %5 = OpConstantNull %v4float
+      %value = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+          %8 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %17 = OpTypeFunction %v4float
+    %float_1 = OpConstant %float 1
+%smoothStep_5f615b = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+         %13 = OpExtInst %v4float %14 SmoothStep %5 %5 %5
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%vertex_main_inner = OpFunction %v4float None %17
+         %19 = OpLabel
+         %20 = OpFunctionCall %void %smoothStep_5f615b
+               OpReturnValue %5
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %23
+               OpStore %vertex_point_size %float_1
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %26 = OpLabel
+         %27 = OpFunctionCall %void %smoothStep_5f615b
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %smoothStep_5f615b
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.wgsl
new file mode 100644
index 0000000..f87d953
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/5f615b.wgsl.expected.wgsl
@@ -0,0 +1,23 @@
+builtins/gen/literal/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+                       ^^^^^^^^^^
+
+fn smoothStep_5f615b() {
+  var res : vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothStep_5f615b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothStep_5f615b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothStep_5f615b();
+}
diff --git a/test/tint/builtins/gen/smoothstep/658be3.wgsl b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/658be3.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/658be3.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.glsl
new file mode 100644
index 0000000..23ebb6a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.glsl
@@ -0,0 +1,53 @@
+builtins/gen/literal/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+                       ^^^^^^^^^^
+
+#version 310 es
+
+void smoothStep_658be3() {
+  vec3 res = smoothstep(vec3(0.0f), vec3(0.0f), vec3(0.0f));
+}
+
+vec4 vertex_main() {
+  smoothStep_658be3();
+  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;
+
+void smoothStep_658be3() {
+  vec3 res = smoothstep(vec3(0.0f), vec3(0.0f), vec3(0.0f));
+}
+
+void fragment_main() {
+  smoothStep_658be3();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+#version 310 es
+
+void smoothStep_658be3() {
+  vec3 res = smoothstep(vec3(0.0f), vec3(0.0f), vec3(0.0f));
+}
+
+void compute_main() {
+  smoothStep_658be3();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.hlsl
new file mode 100644
index 0000000..20ebd1f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+builtins/gen/literal/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+                       ^^^^^^^^^^
+
+void smoothStep_658be3() {
+  float3 res = smoothstep((0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+float4 vertex_main_inner() {
+  smoothStep_658be3();
+  return (0.0f).xxxx;
+}
+
+tint_symbol vertex_main() {
+  const float4 inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = (tint_symbol)0;
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+void fragment_main() {
+  smoothStep_658be3();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  smoothStep_658be3();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.msl
new file mode 100644
index 0000000..2368c8d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.msl
@@ -0,0 +1,37 @@
+builtins/gen/literal/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+                       ^^^^^^^^^^
+
+#include <metal_stdlib>
+
+using namespace metal;
+void smoothStep_658be3() {
+  float3 res = smoothstep(float3(0.0f), float3(0.0f), float3(0.0f));
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+float4 vertex_main_inner() {
+  smoothStep_658be3();
+  return float4(0.0f);
+}
+
+vertex tint_symbol vertex_main() {
+  float4 const inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+fragment void fragment_main() {
+  smoothStep_658be3();
+  return;
+}
+
+kernel void compute_main() {
+  smoothStep_658be3();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.spvasm
new file mode 100644
index 0000000..77eaa09
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.spvasm
@@ -0,0 +1,71 @@
+builtins/gen/literal/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+                       ^^^^^^^^^^
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 33
+; Schema: 0
+               OpCapability Shader
+         %15 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %value "value"
+               OpName %vertex_point_size "vertex_point_size"
+               OpName %smoothStep_658be3 "smoothStep_658be3"
+               OpName %res "res"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %value BuiltIn Position
+               OpDecorate %vertex_point_size BuiltIn PointSize
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %5 = OpConstantNull %v4float
+      %value = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+          %8 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+         %16 = OpConstantNull %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %19 = OpTypeFunction %v4float
+    %float_1 = OpConstant %float 1
+%smoothStep_658be3 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function_v3float Function %16
+         %13 = OpExtInst %v3float %15 SmoothStep %16 %16 %16
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%vertex_main_inner = OpFunction %v4float None %19
+         %21 = OpLabel
+         %22 = OpFunctionCall %void %smoothStep_658be3
+               OpReturnValue %5
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %24 = OpLabel
+         %25 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %25
+               OpStore %vertex_point_size %float_1
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %smoothStep_658be3
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %smoothStep_658be3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.wgsl
new file mode 100644
index 0000000..62eb3cb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/658be3.wgsl.expected.wgsl
@@ -0,0 +1,23 @@
+builtins/gen/literal/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+                       ^^^^^^^^^^
+
+fn smoothStep_658be3() {
+  var res : vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothStep_658be3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothStep_658be3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothStep_658be3();
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl
new file mode 100644
index 0000000..83ae297
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn smoothstep(f32, f32, f32) -> f32
+fn smoothstep_6c4975() {
+  var res: f32 = smoothstep(1.0, 1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothstep_6c4975();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothstep_6c4975();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothstep_6c4975();
+}
diff --git a/test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/6c4975.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/6c4975.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl
new file mode 100644
index 0000000..8be3f55
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn smoothstep(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn smoothstep_aad1db() {
+  var res: vec3<f32> = smoothstep(vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothstep_aad1db();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothstep_aad1db();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothstep_aad1db();
+}
diff --git a/test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/aad1db.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/aad1db.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/smoothstep/c11eef.wgsl b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/c11eef.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.glsl
new file mode 100644
index 0000000..38c8c76
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.glsl
@@ -0,0 +1,53 @@
+builtins/gen/literal/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+                       ^^^^^^^^^^
+
+#version 310 es
+
+void smoothStep_c11eef() {
+  vec2 res = smoothstep(vec2(0.0f), vec2(0.0f), vec2(0.0f));
+}
+
+vec4 vertex_main() {
+  smoothStep_c11eef();
+  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;
+
+void smoothStep_c11eef() {
+  vec2 res = smoothstep(vec2(0.0f), vec2(0.0f), vec2(0.0f));
+}
+
+void fragment_main() {
+  smoothStep_c11eef();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+#version 310 es
+
+void smoothStep_c11eef() {
+  vec2 res = smoothstep(vec2(0.0f), vec2(0.0f), vec2(0.0f));
+}
+
+void compute_main() {
+  smoothStep_c11eef();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.hlsl
new file mode 100644
index 0000000..3a932fe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+builtins/gen/literal/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+                       ^^^^^^^^^^
+
+void smoothStep_c11eef() {
+  float2 res = smoothstep((0.0f).xx, (0.0f).xx, (0.0f).xx);
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+float4 vertex_main_inner() {
+  smoothStep_c11eef();
+  return (0.0f).xxxx;
+}
+
+tint_symbol vertex_main() {
+  const float4 inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = (tint_symbol)0;
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+void fragment_main() {
+  smoothStep_c11eef();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  smoothStep_c11eef();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.msl
new file mode 100644
index 0000000..c705e54
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.msl
@@ -0,0 +1,37 @@
+builtins/gen/literal/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+                       ^^^^^^^^^^
+
+#include <metal_stdlib>
+
+using namespace metal;
+void smoothStep_c11eef() {
+  float2 res = smoothstep(float2(0.0f), float2(0.0f), float2(0.0f));
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+float4 vertex_main_inner() {
+  smoothStep_c11eef();
+  return float4(0.0f);
+}
+
+vertex tint_symbol vertex_main() {
+  float4 const inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+fragment void fragment_main() {
+  smoothStep_c11eef();
+  return;
+}
+
+kernel void compute_main() {
+  smoothStep_c11eef();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.spvasm
new file mode 100644
index 0000000..9220aec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.spvasm
@@ -0,0 +1,71 @@
+builtins/gen/literal/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+                       ^^^^^^^^^^
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 33
+; Schema: 0
+               OpCapability Shader
+         %15 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %value "value"
+               OpName %vertex_point_size "vertex_point_size"
+               OpName %smoothStep_c11eef "smoothStep_c11eef"
+               OpName %res "res"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %value BuiltIn Position
+               OpDecorate %vertex_point_size BuiltIn PointSize
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %5 = OpConstantNull %v4float
+      %value = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+          %8 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+         %16 = OpConstantNull %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpTypeFunction %v4float
+    %float_1 = OpConstant %float 1
+%smoothStep_c11eef = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function_v2float Function %16
+         %13 = OpExtInst %v2float %15 SmoothStep %16 %16 %16
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%vertex_main_inner = OpFunction %v4float None %19
+         %21 = OpLabel
+         %22 = OpFunctionCall %void %smoothStep_c11eef
+               OpReturnValue %5
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %24 = OpLabel
+         %25 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %25
+               OpStore %vertex_point_size %float_1
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %smoothStep_c11eef
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %smoothStep_c11eef
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.wgsl
new file mode 100644
index 0000000..0019310
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/c11eef.wgsl.expected.wgsl
@@ -0,0 +1,23 @@
+builtins/gen/literal/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
+  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+                       ^^^^^^^^^^
+
+fn smoothStep_c11eef() {
+  var res : vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothStep_c11eef();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothStep_c11eef();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothStep_c11eef();
+}
diff --git a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl
similarity index 100%
rename from test/tint/builtins/gen/smoothstep/cb0bfb.wgsl
rename to test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl
diff --git a/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.glsl
new file mode 100644
index 0000000..ed815ff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.glsl
@@ -0,0 +1,53 @@
+builtins/gen/literal/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
+  var res: f32 = smoothStep(1.0, 1.0, 1.0);
+                 ^^^^^^^^^^
+
+#version 310 es
+
+void smoothStep_cb0bfb() {
+  float res = smoothstep(1.0f, 1.0f, 1.0f);
+}
+
+vec4 vertex_main() {
+  smoothStep_cb0bfb();
+  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;
+
+void smoothStep_cb0bfb() {
+  float res = smoothstep(1.0f, 1.0f, 1.0f);
+}
+
+void fragment_main() {
+  smoothStep_cb0bfb();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+#version 310 es
+
+void smoothStep_cb0bfb() {
+  float res = smoothstep(1.0f, 1.0f, 1.0f);
+}
+
+void compute_main() {
+  smoothStep_cb0bfb();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.hlsl
new file mode 100644
index 0000000..55e794b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+builtins/gen/literal/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
+  var res: f32 = smoothStep(1.0, 1.0, 1.0);
+                 ^^^^^^^^^^
+
+void smoothStep_cb0bfb() {
+  float res = smoothstep(1.0f, 1.0f, 1.0f);
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+float4 vertex_main_inner() {
+  smoothStep_cb0bfb();
+  return (0.0f).xxxx;
+}
+
+tint_symbol vertex_main() {
+  const float4 inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = (tint_symbol)0;
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+void fragment_main() {
+  smoothStep_cb0bfb();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  smoothStep_cb0bfb();
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.msl b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.msl
new file mode 100644
index 0000000..ae8ef12
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.msl
@@ -0,0 +1,37 @@
+builtins/gen/literal/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
+  var res: f32 = smoothStep(1.0, 1.0, 1.0);
+                 ^^^^^^^^^^
+
+#include <metal_stdlib>
+
+using namespace metal;
+void smoothStep_cb0bfb() {
+  float res = smoothstep(1.0f, 1.0f, 1.0f);
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+float4 vertex_main_inner() {
+  smoothStep_cb0bfb();
+  return float4(0.0f);
+}
+
+vertex tint_symbol vertex_main() {
+  float4 const inner_result = vertex_main_inner();
+  tint_symbol wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
+fragment void fragment_main() {
+  smoothStep_cb0bfb();
+  return;
+}
+
+kernel void compute_main() {
+  smoothStep_cb0bfb();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.spvasm
new file mode 100644
index 0000000..1e46e2d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+builtins/gen/literal/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
+  var res: f32 = smoothStep(1.0, 1.0, 1.0);
+                 ^^^^^^^^^^
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+         %14 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %value "value"
+               OpName %vertex_point_size "vertex_point_size"
+               OpName %smoothStep_cb0bfb "smoothStep_cb0bfb"
+               OpName %res "res"
+               OpName %vertex_main_inner "vertex_main_inner"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %value BuiltIn Position
+               OpDecorate %vertex_point_size BuiltIn PointSize
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %5 = OpConstantNull %v4float
+      %value = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+          %8 = OpConstantNull %float
+%vertex_point_size = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %v4float
+%smoothStep_cb0bfb = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function_float Function %8
+         %13 = OpExtInst %float %14 SmoothStep %float_1 %float_1 %float_1
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%vertex_main_inner = OpFunction %v4float None %18
+         %20 = OpLabel
+         %21 = OpFunctionCall %void %smoothStep_cb0bfb
+               OpReturnValue %5
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %23 = OpLabel
+         %24 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %24
+               OpStore %vertex_point_size %float_1
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %26 = OpLabel
+         %27 = OpFunctionCall %void %smoothStep_cb0bfb
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %smoothStep_cb0bfb
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.wgsl
new file mode 100644
index 0000000..cfa44d3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/smoothstep/cb0bfb.wgsl.expected.wgsl
@@ -0,0 +1,23 @@
+builtins/gen/literal/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
+  var res: f32 = smoothStep(1.0, 1.0, 1.0);
+                 ^^^^^^^^^^
+
+fn smoothStep_cb0bfb() {
+  var res : f32 = smoothStep(1.0, 1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  smoothStep_cb0bfb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  smoothStep_cb0bfb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  smoothStep_cb0bfb();
+}
diff --git a/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl
new file mode 100644
index 0000000..b99db85
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sqrt(f32) -> f32
+fn sqrt_20c74e() {
+  var res: f32 = sqrt(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sqrt_20c74e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sqrt_20c74e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sqrt_20c74e();
+}
diff --git a/test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.msl b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/20c74e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sqrt/20c74e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl
new file mode 100644
index 0000000..0062069
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sqrt(vec<2, f32>) -> vec<2, f32>
+fn sqrt_8c7024() {
+  var res: vec2<f32> = sqrt(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sqrt_8c7024();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sqrt_8c7024();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sqrt_8c7024();
+}
diff --git a/test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.msl b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/8c7024.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sqrt/8c7024.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl
new file mode 100644
index 0000000..d28e561
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sqrt(vec<4, f32>) -> vec<4, f32>
+fn sqrt_aa0d7a() {
+  var res: vec4<f32> = sqrt(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sqrt_aa0d7a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sqrt_aa0d7a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sqrt_aa0d7a();
+}
diff --git a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.msl b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/aa0d7a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sqrt/aa0d7a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl
new file mode 100644
index 0000000..11ea95c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn sqrt(vec<3, f32>) -> vec<3, f32>
+fn sqrt_f8c59a() {
+  var res: vec3<f32> = sqrt(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  sqrt_f8c59a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  sqrt_f8c59a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  sqrt_f8c59a();
+}
diff --git a/test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.msl b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/sqrt/f8c59a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/sqrt/f8c59a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/step/0b073b.wgsl b/test/tint/builtins/gen/literal/step/0b073b.wgsl
new file mode 100644
index 0000000..c143dd8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/step/0b073b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn step(f32, f32) -> f32
+fn step_0b073b() {
+  var res: f32 = step(1.0, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  step_0b073b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  step_0b073b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  step_0b073b();
+}
diff --git a/test/tint/builtins/gen/step/0b073b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/step/0b073b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/step/0b073b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/step/0b073b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/step/0b073b.wgsl.expected.msl b/test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/step/0b073b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/step/0b073b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/step/0b073b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/step/0b073b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/step/0b073b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/step/0b073b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/step/19accd.wgsl b/test/tint/builtins/gen/literal/step/19accd.wgsl
new file mode 100644
index 0000000..10741be
--- /dev/null
+++ b/test/tint/builtins/gen/literal/step/19accd.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn step(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
+fn step_19accd() {
+  var res: vec2<f32> = step(vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  step_19accd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  step_19accd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  step_19accd();
+}
diff --git a/test/tint/builtins/gen/step/19accd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/step/19accd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/step/19accd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/step/19accd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/step/19accd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/step/19accd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/step/19accd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/step/19accd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/step/19accd.wgsl.expected.msl b/test/tint/builtins/gen/literal/step/19accd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/step/19accd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/step/19accd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/step/19accd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/step/19accd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/step/19accd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/step/19accd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/step/19accd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/step/19accd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/step/19accd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/step/19accd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/step/334303.wgsl b/test/tint/builtins/gen/literal/step/334303.wgsl
new file mode 100644
index 0000000..4643f33
--- /dev/null
+++ b/test/tint/builtins/gen/literal/step/334303.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn step(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
+fn step_334303() {
+  var res: vec3<f32> = step(vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  step_334303();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  step_334303();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  step_334303();
+}
diff --git a/test/tint/builtins/gen/step/334303.wgsl.expected.glsl b/test/tint/builtins/gen/literal/step/334303.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/step/334303.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/step/334303.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/step/334303.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/step/334303.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/step/334303.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/step/334303.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/step/334303.wgsl.expected.msl b/test/tint/builtins/gen/literal/step/334303.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/step/334303.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/step/334303.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/step/334303.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/step/334303.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/step/334303.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/step/334303.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/step/334303.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/step/334303.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/step/334303.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/step/334303.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/step/e2b337.wgsl b/test/tint/builtins/gen/literal/step/e2b337.wgsl
new file mode 100644
index 0000000..41cff04
--- /dev/null
+++ b/test/tint/builtins/gen/literal/step/e2b337.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn step(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
+fn step_e2b337() {
+  var res: vec4<f32> = step(vec4<f32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  step_e2b337();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  step_e2b337();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  step_e2b337();
+}
diff --git a/test/tint/builtins/gen/step/e2b337.wgsl.expected.glsl b/test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/step/e2b337.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/step/e2b337.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/step/e2b337.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/step/e2b337.wgsl.expected.msl b/test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/step/e2b337.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/step/e2b337.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/step/e2b337.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/step/e2b337.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/step/e2b337.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/step/e2b337.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl
new file mode 100644
index 0000000..5306f6c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn storageBarrier()
+fn storageBarrier_d87211() {
+  storageBarrier();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  storageBarrier_d87211();
+}
diff --git a/test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.glsl b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.msl b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/storageBarrier/d87211.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/storageBarrier/d87211.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tan/244e2a.wgsl b/test/tint/builtins/gen/literal/tan/244e2a.wgsl
new file mode 100644
index 0000000..f9920e7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tan/244e2a.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tan(vec<4, f32>) -> vec<4, f32>
+fn tan_244e2a() {
+  var res: vec4<f32> = tan(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tan_244e2a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tan_244e2a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tan_244e2a();
+}
diff --git a/test/tint/builtins/gen/tan/244e2a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tan/244e2a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tan/244e2a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tan/244e2a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tan/244e2a.wgsl.expected.msl b/test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tan/244e2a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tan/244e2a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tan/244e2a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tan/244e2a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tan/244e2a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tan/244e2a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tan/2f030e.wgsl b/test/tint/builtins/gen/literal/tan/2f030e.wgsl
new file mode 100644
index 0000000..39c06f5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tan/2f030e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tan(f32) -> f32
+fn tan_2f030e() {
+  var res: f32 = tan(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tan_2f030e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tan_2f030e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tan_2f030e();
+}
diff --git a/test/tint/builtins/gen/tan/2f030e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tan/2f030e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tan/2f030e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tan/2f030e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tan/2f030e.wgsl.expected.msl b/test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tan/2f030e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tan/2f030e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tan/2f030e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tan/2f030e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tan/2f030e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tan/2f030e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tan/7ea104.wgsl b/test/tint/builtins/gen/literal/tan/7ea104.wgsl
new file mode 100644
index 0000000..4ed0b9b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tan/7ea104.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tan(vec<3, f32>) -> vec<3, f32>
+fn tan_7ea104() {
+  var res: vec3<f32> = tan(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tan_7ea104();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tan_7ea104();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tan_7ea104();
+}
diff --git a/test/tint/builtins/gen/tan/7ea104.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tan/7ea104.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tan/7ea104.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tan/7ea104.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tan/7ea104.wgsl.expected.msl b/test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tan/7ea104.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tan/7ea104.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tan/7ea104.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tan/7ea104.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tan/7ea104.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tan/7ea104.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl
new file mode 100644
index 0000000..3c587aa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tan(vec<2, f32>) -> vec<2, f32>
+fn tan_8ce3e9() {
+  var res: vec2<f32> = tan(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tan_8ce3e9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tan_8ce3e9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tan_8ce3e9();
+}
diff --git a/test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.msl b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tan/8ce3e9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tan/8ce3e9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tanh/5663c5.wgsl b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl
new file mode 100644
index 0000000..3f88d44
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tanh(vec<4, f32>) -> vec<4, f32>
+fn tanh_5663c5() {
+  var res: vec4<f32> = tanh(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tanh_5663c5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tanh_5663c5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tanh_5663c5();
+}
diff --git a/test/tint/builtins/gen/tanh/5663c5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5663c5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tanh/5663c5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5663c5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tanh/5663c5.wgsl.expected.msl b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5663c5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tanh/5663c5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tanh/5663c5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tanh/5663c5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5663c5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tanh/5663c5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tanh/5724b3.wgsl b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl
new file mode 100644
index 0000000..8715b26
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tanh(vec<2, f32>) -> vec<2, f32>
+fn tanh_5724b3() {
+  var res: vec2<f32> = tanh(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tanh_5724b3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tanh_5724b3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tanh_5724b3();
+}
diff --git a/test/tint/builtins/gen/tanh/5724b3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5724b3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tanh/5724b3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5724b3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tanh/5724b3.wgsl.expected.msl b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5724b3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tanh/5724b3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tanh/5724b3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tanh/5724b3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/5724b3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tanh/5724b3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl
new file mode 100644
index 0000000..7602a18
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tanh(vec<3, f32>) -> vec<3, f32>
+fn tanh_9f9fb9() {
+  var res: vec3<f32> = tanh(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tanh_9f9fb9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tanh_9f9fb9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tanh_9f9fb9();
+}
diff --git a/test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.msl b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/9f9fb9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tanh/9f9fb9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl
new file mode 100644
index 0000000..f83b841
--- /dev/null
+++ b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn tanh(f32) -> f32
+fn tanh_c15fdb() {
+  var res: f32 = tanh(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  tanh_c15fdb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  tanh_c15fdb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  tanh_c15fdb();
+}
diff --git a/test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.msl b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/tanh/c15fdb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/tanh/c15fdb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl
new file mode 100644
index 0000000..b93721f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
+
+// fn textureDimensions(texture: texture_1d<f32>) -> i32
+fn textureDimensions_002b2a() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_002b2a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_002b2a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_002b2a();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.glsl
new file mode 100644
index 0000000..9ee3490
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureDimensions_002b2a() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_002b2a();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler1D arg_0_1;
+void textureDimensions_002b2a() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void fragment_main() {
+  textureDimensions_002b2a();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'sampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureDimensions_002b2a() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void compute_main() {
+  textureDimensions_002b2a();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/002b2a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl
new file mode 100644
index 0000000..d011596
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<r32sint, write>) -> vec2<i32>
+fn textureDimensions_012b82() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_012b82();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_012b82();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_012b82();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/012b82.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/012b82.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl
new file mode 100644
index 0000000..4e071a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba16sint, write>) -> i32
+fn textureDimensions_08753d() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_08753d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_08753d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_08753d();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.glsl
new file mode 100644
index 0000000..0b0f9e3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba16i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_08753d() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_08753d();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba16i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_08753d() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_08753d();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba16i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_08753d() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_08753d();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/08753d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl
new file mode 100644
index 0000000..3acce51
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba16float, write>) -> vec3<i32>
+fn textureDimensions_0c4772() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_0c4772();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_0c4772();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_0c4772();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0c4772.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/0c4772.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl
new file mode 100644
index 0000000..410f924
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<r32sint, write>) -> i32
+fn textureDimensions_0cce40() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_0cce40();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_0cce40();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_0cce40();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.glsl
new file mode 100644
index 0000000..a0df901
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(r32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_0cce40() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_0cce40();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(r32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_0cce40() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_0cce40();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(r32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_0cce40() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_0cce40();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/0cce40.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl
new file mode 100644
index 0000000..4ca0928
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba16uint, write>) -> vec2<i32>
+fn textureDimensions_0cf2ff() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_0cf2ff();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_0cf2ff();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_0cf2ff();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/0cf2ff.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl
new file mode 100644
index 0000000..6927776
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<r32uint, write>) -> vec2<i32>
+fn textureDimensions_0d8b7e() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_0d8b7e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_0d8b7e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_0d8b7e();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/0d8b7e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl
new file mode 100644
index 0000000..60d2aa3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba16uint, write>) -> vec3<i32>
+fn textureDimensions_0e32ee() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_0e32ee();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_0e32ee();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_0e32ee();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0e32ee.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/0e32ee.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl
new file mode 100644
index 0000000..c8010cb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
+
+// fn textureDimensions(texture: texture_2d_array<i32>) -> vec2<i32>
+fn textureDimensions_0f3c50() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_0f3c50();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_0f3c50();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_0f3c50();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/0f3c50.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/0f3c50.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl
new file mode 100644
index 0000000..172d049
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
+
+// fn textureDimensions(texture: texture_2d<u32>) -> vec2<i32>
+fn textureDimensions_1191a5() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_1191a5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_1191a5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_1191a5();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1191a5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/1191a5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl
new file mode 100644
index 0000000..582382e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+
+// fn textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
+fn textureDimensions_12c9bb() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_12c9bb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_12c9bb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_12c9bb();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/12c9bb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/12c9bb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl
new file mode 100644
index 0000000..17e2e21
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rg32float, write>) -> vec2<i32>
+fn textureDimensions_147998() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_147998();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_147998();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_147998();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.glsl
new file mode 100644
index 0000000..90d19e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2D arg_0;
+void textureDimensions_147998() {
+  ivec2 res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_147998();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image2D arg_0;
+void textureDimensions_147998() {
+  ivec2 res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_147998();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2D arg_0;
+void textureDimensions_147998() {
+  ivec2 res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_147998();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/147998.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl
new file mode 100644
index 0000000..84ce998
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba8sint, write>) -> vec2<i32>
+fn textureDimensions_16036c() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_16036c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_16036c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_16036c();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/16036c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/16036c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl
new file mode 100644
index 0000000..77f345d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba16sint, write>) -> vec3<i32>
+fn textureDimensions_1b71f0() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_1b71f0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_1b71f0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_1b71f0();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1b71f0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/1b71f0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl
new file mode 100644
index 0000000..0b5857d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba8unorm, write>) -> vec2<i32>
+fn textureDimensions_1d6c26() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_1d6c26();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_1d6c26();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_1d6c26();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1d6c26.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/1d6c26.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl
new file mode 100644
index 0000000..c40f9c0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba16float, write>) -> i32
+fn textureDimensions_1e9e39() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_1e9e39();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_1e9e39();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_1e9e39();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.glsl
new file mode 100644
index 0000000..067bc8b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba16f) uniform highp writeonly image1D arg_0;
+void textureDimensions_1e9e39() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_1e9e39();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba16f) uniform highp writeonly image1D arg_0;
+void textureDimensions_1e9e39() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_1e9e39();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba16f) uniform highp writeonly image1D arg_0;
+void textureDimensions_1e9e39() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_1e9e39();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/1e9e39.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl
new file mode 100644
index 0000000..8301b57
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
+
+// fn textureDimensions(texture: texture_2d_array<u32>) -> vec2<i32>
+fn textureDimensions_1f20c5() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_1f20c5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_1f20c5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_1f20c5();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/1f20c5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/1f20c5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl
new file mode 100644
index 0000000..e3ac96c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba8sint, write>) -> vec3<i32>
+fn textureDimensions_214dd4() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_214dd4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_214dd4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_214dd4();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/214dd4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/214dd4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl
new file mode 100644
index 0000000..b2c83dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
+
+// fn textureDimensions(texture: texture_cube_array<i32>, level: i32) -> vec2<i32>
+fn textureDimensions_221f22() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_221f22();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_221f22();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_221f22();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.glsl
new file mode 100644
index 0000000..2e53eb0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureDimensions_221f22() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_221f22();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureDimensions_221f22() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_221f22();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureDimensions_221f22() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_221f22();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/221f22.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl
new file mode 100644
index 0000000..47d7985
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
+
+// fn textureDimensions(texture: texture_2d_array<u32>, level: i32) -> vec2<i32>
+fn textureDimensions_267788() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_267788();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_267788();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_267788();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/267788.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/267788.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl
new file mode 100644
index 0000000..fa58009
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+
+// fn textureDimensions(texture: texture_3d<f32>, level: i32) -> vec3<i32>
+fn textureDimensions_26bdfa() {
+  var res: vec3<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_26bdfa();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_26bdfa();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_26bdfa();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26bdfa.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/26bdfa.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl
new file mode 100644
index 0000000..ccf3250
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba8uint, write>) -> vec2<i32>
+fn textureDimensions_26ef6c() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_26ef6c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_26ef6c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_26ef6c();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/26ef6c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/26ef6c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl
new file mode 100644
index 0000000..25a8b28
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba16sint, write>) -> vec2<i32>
+fn textureDimensions_2ad087() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_2ad087();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_2ad087();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_2ad087();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2ad087.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/2ad087.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl
new file mode 100644
index 0000000..313b799
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
+
+// fn textureDimensions(texture: texture_3d<u32>, level: i32) -> vec3<i32>
+fn textureDimensions_2efa05() {
+  var res: vec3<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_2efa05();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_2efa05();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_2efa05();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2efa05.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/2efa05.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl
new file mode 100644
index 0000000..63835a1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<r32sint, write>) -> vec3<i32>
+fn textureDimensions_2f289f() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_2f289f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_2f289f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_2f289f();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2f289f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/2f289f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl
new file mode 100644
index 0000000..3ac4832
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+
+// fn textureDimensions(texture: texture_2d<f32>, level: i32) -> vec2<i32>
+fn textureDimensions_2fe1cc() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_2fe1cc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_2fe1cc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_2fe1cc();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/2fe1cc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl
new file mode 100644
index 0000000..4563fc8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba16uint, write>) -> i32
+fn textureDimensions_318ecc() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_318ecc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_318ecc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_318ecc();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.glsl
new file mode 100644
index 0000000..078e8b3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_318ecc() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_318ecc();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_318ecc() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_318ecc();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_318ecc() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_318ecc();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/318ecc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl
new file mode 100644
index 0000000..801a81e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<r32uint, write>) -> vec3<i32>
+fn textureDimensions_340d06() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_340d06();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_340d06();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_340d06();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/340d06.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/340d06.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl
new file mode 100644
index 0000000..d8a22e3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba32uint, write>) -> vec2<i32>
+fn textureDimensions_398e30() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_398e30();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_398e30();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_398e30();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/398e30.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/398e30.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl
new file mode 100644
index 0000000..d00adb2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rg32uint, write>) -> vec2<i32>
+fn textureDimensions_3a94ea() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_3a94ea();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_3a94ea();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_3a94ea();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.glsl
new file mode 100644
index 0000000..4e7d263
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2D arg_0;
+void textureDimensions_3a94ea() {
+  ivec2 res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_3a94ea();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage2D arg_0;
+void textureDimensions_3a94ea() {
+  ivec2 res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_3a94ea();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2D arg_0;
+void textureDimensions_3a94ea() {
+  ivec2 res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_3a94ea();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/3a94ea.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl
new file mode 100644
index 0000000..01a56a9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba32float, write>) -> i32
+fn textureDimensions_3aca08() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_3aca08();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_3aca08();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_3aca08();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.glsl
new file mode 100644
index 0000000..e9c1656
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_3aca08() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_3aca08();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_3aca08() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_3aca08();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_3aca08() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_3aca08();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/3aca08.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl
new file mode 100644
index 0000000..9d72673
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba8sint, write>) -> vec2<i32>
+fn textureDimensions_3c5ad8() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_3c5ad8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_3c5ad8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_3c5ad8();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/3c5ad8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl
new file mode 100644
index 0000000..52a3a07
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
+
+// fn textureDimensions(texture: texture_cube_array<u32>) -> vec2<i32>
+fn textureDimensions_4152a6() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_4152a6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_4152a6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_4152a6();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.glsl
new file mode 100644
index 0000000..d3120a3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureDimensions_4152a6() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_4152a6();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureDimensions_4152a6() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_4152a6();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureDimensions_4152a6() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_4152a6();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/4152a6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl
new file mode 100644
index 0000000..3fd9d7b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
+
+// fn textureDimensions(texture: texture_1d<i32>) -> i32
+fn textureDimensions_423f99() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_423f99();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_423f99();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_423f99();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.glsl
new file mode 100644
index 0000000..08f2e24
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureDimensions_423f99() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_423f99();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler1D arg_0_1;
+void textureDimensions_423f99() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void fragment_main() {
+  textureDimensions_423f99();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureDimensions_423f99() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void compute_main() {
+  textureDimensions_423f99();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/423f99.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl
new file mode 100644
index 0000000..1c849b8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba32float, write>) -> vec2<i32>
+fn textureDimensions_4267ee() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_4267ee();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_4267ee();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_4267ee();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4267ee.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/4267ee.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl
new file mode 100644
index 0000000..ac087c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba8unorm, write>) -> i32
+fn textureDimensions_42d4e6() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_42d4e6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_42d4e6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_42d4e6();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.glsl
new file mode 100644
index 0000000..f59d175
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8) uniform highp writeonly image1D arg_0;
+void textureDimensions_42d4e6() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_42d4e6();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8) uniform highp writeonly image1D arg_0;
+void textureDimensions_42d4e6() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_42d4e6();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8) uniform highp writeonly image1D arg_0;
+void textureDimensions_42d4e6() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_42d4e6();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/42d4e6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl
new file mode 100644
index 0000000..c278ed8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba16float, write>) -> vec2<i32>
+fn textureDimensions_48cb89() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_48cb89();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_48cb89();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_48cb89();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/48cb89.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/48cb89.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl
new file mode 100644
index 0000000..dd85926
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rg32sint, write>) -> vec2<i32>
+fn textureDimensions_49d274() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_49d274();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_49d274();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_49d274();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.glsl
new file mode 100644
index 0000000..70347a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureDimensions_49d274() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_49d274();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureDimensions_49d274() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_49d274();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureDimensions_49d274() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+void compute_main() {
+  textureDimensions_49d274();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/49d274.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl
new file mode 100644
index 0000000..c95dd96
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rg32uint, write>) -> i32
+fn textureDimensions_4df9a8() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_4df9a8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_4df9a8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_4df9a8();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.glsl
new file mode 100644
index 0000000..7871ed7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_4df9a8() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_4df9a8();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_4df9a8() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_4df9a8();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_4df9a8() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_4df9a8();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/4df9a8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl
new file mode 100644
index 0000000..92c35ab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+
+// fn textureDimensions(texture: texture_cube_array<f32>, level: i32) -> vec2<i32>
+fn textureDimensions_50a9ee() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_50a9ee();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_50a9ee();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_50a9ee();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.glsl
new file mode 100644
index 0000000..a02b6e6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_50a9ee() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_50a9ee();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_50a9ee() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_50a9ee();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_50a9ee() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_50a9ee();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/50a9ee.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl
new file mode 100644
index 0000000..5a7c5ff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
+
+// fn textureDimensions(texture: texture_1d<i32>, level: i32) -> i32
+fn textureDimensions_52045c() {
+  var res: i32 = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_52045c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_52045c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_52045c();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.glsl
new file mode 100644
index 0000000..f4c5ca9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureDimensions_52045c() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_52045c();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler1D arg_0_1;
+void textureDimensions_52045c() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void fragment_main() {
+  textureDimensions_52045c();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureDimensions_52045c() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void compute_main() {
+  textureDimensions_52045c();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/52045c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl
new file mode 100644
index 0000000..06255e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rg32float, write>) -> i32
+fn textureDimensions_55b23e() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_55b23e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_55b23e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_55b23e();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.glsl
new file mode 100644
index 0000000..a9465b8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_55b23e() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_55b23e();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_55b23e() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_55b23e();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_55b23e() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_55b23e();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/55b23e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl
new file mode 100644
index 0000000..963d480
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
+
+// fn textureDimensions(texture: texture_multisampled_2d<u32>) -> vec2<i32>
+fn textureDimensions_579629() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_579629();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_579629();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_579629();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/579629.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/579629.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl
new file mode 100644
index 0000000..5b7a168
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<r32uint, write>) -> i32
+fn textureDimensions_57da0b() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_57da0b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_57da0b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_57da0b();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.glsl
new file mode 100644
index 0000000..c45ed2f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(r32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_57da0b() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_57da0b();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(r32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_57da0b() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_57da0b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(r32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_57da0b() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_57da0b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/57da0b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl
new file mode 100644
index 0000000..0b9d680
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+
+// fn textureDimensions(texture: texture_depth_cube) -> vec2<i32>
+fn textureDimensions_57e28f() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_57e28f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_57e28f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_57e28f();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/57e28f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/57e28f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl
new file mode 100644
index 0000000..df0e9cd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba16float, write>) -> vec2<i32>
+fn textureDimensions_58a515() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_58a515();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_58a515();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_58a515();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/58a515.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/58a515.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl
new file mode 100644
index 0000000..dffa849
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba32sint, write>) -> vec2<i32>
+fn textureDimensions_5985f3() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_5985f3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_5985f3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_5985f3();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5985f3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/5985f3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl
new file mode 100644
index 0000000..5582c6e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba32uint, write>) -> i32
+fn textureDimensions_5caa5e() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_5caa5e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_5caa5e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_5caa5e();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.glsl
new file mode 100644
index 0000000..d02caf1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_5caa5e() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_5caa5e();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_5caa5e() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_5caa5e();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_5caa5e() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_5caa5e();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/5caa5e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl
new file mode 100644
index 0000000..b855d3c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba16uint, write>) -> vec2<i32>
+fn textureDimensions_5e295d() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_5e295d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_5e295d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_5e295d();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/5e295d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/5e295d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl
new file mode 100644
index 0000000..df274c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rg32sint, write>) -> vec3<i32>
+fn textureDimensions_60bf54() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_60bf54();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_60bf54();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_60bf54();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.glsl
new file mode 100644
index 0000000..91d0815
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage3D arg_0;
+void textureDimensions_60bf54() {
+  ivec3 res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_60bf54();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage3D arg_0;
+void textureDimensions_60bf54() {
+  ivec3 res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_60bf54();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage3D arg_0;
+void textureDimensions_60bf54() {
+  ivec3 res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_60bf54();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/60bf54.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl
new file mode 100644
index 0000000..ae013ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rg32float, write>) -> vec3<i32>
+fn textureDimensions_63f3cf() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_63f3cf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_63f3cf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_63f3cf();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.glsl
new file mode 100644
index 0000000..6a77ea9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image3D arg_0;
+void textureDimensions_63f3cf() {
+  ivec3 res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_63f3cf();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image3D arg_0;
+void textureDimensions_63f3cf() {
+  ivec3 res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_63f3cf();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image3D arg_0;
+void textureDimensions_63f3cf() {
+  ivec3 res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_63f3cf();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/63f3cf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl
new file mode 100644
index 0000000..ddac6b6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba32uint, write>) -> vec2<i32>
+fn textureDimensions_68105c() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_68105c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_68105c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_68105c();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/68105c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/68105c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl
new file mode 100644
index 0000000..c85334c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<i32>;
+
+// fn textureDimensions(texture: texture_cube<i32>, level: i32) -> vec2<i32>
+fn textureDimensions_686ef2() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_686ef2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_686ef2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_686ef2();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/686ef2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/686ef2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl
new file mode 100644
index 0000000..d079cf9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba32sint, write>) -> i32
+fn textureDimensions_6adac6() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_6adac6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_6adac6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_6adac6();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.glsl
new file mode 100644
index 0000000..acaaa5a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_6adac6() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_6adac6();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_6adac6() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_6adac6();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_6adac6() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_6adac6();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/6adac6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl
new file mode 100644
index 0000000..eaab191
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
+
+// fn textureDimensions(texture: texture_3d<u32>) -> vec3<i32>
+fn textureDimensions_6ec1b4() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_6ec1b4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_6ec1b4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_6ec1b4();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/6ec1b4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl
new file mode 100644
index 0000000..05ff750
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba8snorm, write>) -> vec2<i32>
+fn textureDimensions_6f0d79() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_6f0d79();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_6f0d79();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_6f0d79();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/6f0d79.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/6f0d79.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl
new file mode 100644
index 0000000..0673cb4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba8unorm, write>) -> vec2<i32>
+fn textureDimensions_702c53() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_702c53();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_702c53();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_702c53();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/702c53.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/702c53.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl
new file mode 100644
index 0000000..997406c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+
+// fn textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
+fn textureDimensions_72e5d6() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_72e5d6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_72e5d6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_72e5d6();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/72e5d6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/72e5d6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl
new file mode 100644
index 0000000..1b70f6a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
+
+// fn textureDimensions(texture: texture_1d<u32>, level: i32) -> i32
+fn textureDimensions_79df87() {
+  var res: i32 = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_79df87();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_79df87();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_79df87();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.glsl
new file mode 100644
index 0000000..b7ee7fd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureDimensions_79df87() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_79df87();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler1D arg_0_1;
+void textureDimensions_79df87() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void fragment_main() {
+  textureDimensions_79df87();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureDimensions_79df87() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void compute_main() {
+  textureDimensions_79df87();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/79df87.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl
new file mode 100644
index 0000000..6297e5a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+
+// fn textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
+fn textureDimensions_7bf826() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_7bf826();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_7bf826();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_7bf826();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7bf826.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/7bf826.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl
new file mode 100644
index 0000000..97ce4dd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rg32sint, write>) -> vec2<i32>
+fn textureDimensions_7f5c2e() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_7f5c2e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_7f5c2e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_7f5c2e();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.glsl
new file mode 100644
index 0000000..ed85e7d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2D arg_0;
+void textureDimensions_7f5c2e() {
+  ivec2 res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_7f5c2e();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage2D arg_0;
+void textureDimensions_7f5c2e() {
+  ivec2 res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_7f5c2e();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2D arg_0;
+void textureDimensions_7f5c2e() {
+  ivec2 res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_7f5c2e();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/7f5c2e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl
new file mode 100644
index 0000000..b478fa2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<r32float, write>) -> vec3<i32>
+fn textureDimensions_8028f3() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_8028f3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_8028f3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_8028f3();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8028f3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/8028f3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl
new file mode 100644
index 0000000..7d7722d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba32uint, write>) -> vec3<i32>
+fn textureDimensions_811679() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_811679();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_811679();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_811679();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/811679.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/811679.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl
new file mode 100644
index 0000000..8ec3269
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rg32uint, write>) -> vec3<i32>
+fn textureDimensions_820596() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_820596();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_820596();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_820596();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.glsl
new file mode 100644
index 0000000..12ee4ec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage3D arg_0;
+void textureDimensions_820596() {
+  ivec3 res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_820596();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage3D arg_0;
+void textureDimensions_820596() {
+  ivec3 res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_820596();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage3D arg_0;
+void textureDimensions_820596() {
+  ivec3 res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_820596();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/820596.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl
new file mode 100644
index 0000000..bdd0b53
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba32sint, write>) -> vec2<i32>
+fn textureDimensions_83ee5a() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_83ee5a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_83ee5a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_83ee5a();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/83ee5a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/83ee5a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl
new file mode 100644
index 0000000..18cf513
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+
+// fn textureDimensions(texture: texture_2d_array<f32>, level: i32) -> vec2<i32>
+fn textureDimensions_85d556() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_85d556();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_85d556();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_85d556();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/85d556.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/85d556.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl
new file mode 100644
index 0000000..88f43f8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<u32>;
+
+// fn textureDimensions(texture: texture_cube<u32>, level: i32) -> vec2<i32>
+fn textureDimensions_88ad17() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_88ad17();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_88ad17();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_88ad17();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/88ad17.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/88ad17.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl
new file mode 100644
index 0000000..4468f26
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+
+// fn textureDimensions(texture: texture_3d<f32>) -> vec3<i32>
+fn textureDimensions_8aa4c4() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_8aa4c4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_8aa4c4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_8aa4c4();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/8aa4c4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl
new file mode 100644
index 0000000..de87126
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
+
+// fn textureDimensions(texture: texture_3d<i32>) -> vec3<i32>
+fn textureDimensions_8deb5e() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_8deb5e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_8deb5e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_8deb5e();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8deb5e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/8deb5e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl
new file mode 100644
index 0000000..ba50596
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+
+// fn textureDimensions(texture: texture_cube_array<f32>) -> vec2<i32>
+fn textureDimensions_8f20bf() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_8f20bf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_8f20bf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_8f20bf();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.glsl
new file mode 100644
index 0000000..a01eead
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_8f20bf() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_8f20bf();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_8f20bf() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_8f20bf();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_8f20bf() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_8f20bf();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/8f20bf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl
new file mode 100644
index 0000000..ca949de
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba32float, write>) -> vec3<i32>
+fn textureDimensions_8fca0f() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_8fca0f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_8fca0f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_8fca0f();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/8fca0f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/8fca0f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl
new file mode 100644
index 0000000..4acb1f6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+
+// fn textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
+fn textureDimensions_90340b() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_90340b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_90340b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_90340b();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.glsl
new file mode 100644
index 0000000..09d10eb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_90340b() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_90340b();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_90340b() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_90340b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_90340b() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_90340b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/90340b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl
new file mode 100644
index 0000000..6365cba
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rg32uint, write>) -> vec2<i32>
+fn textureDimensions_9042ab() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9042ab();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9042ab();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9042ab();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.glsl
new file mode 100644
index 0000000..1fb6520
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureDimensions_9042ab() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_9042ab();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureDimensions_9042ab() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_9042ab();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureDimensions_9042ab() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+void compute_main() {
+  textureDimensions_9042ab();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9042ab.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl
new file mode 100644
index 0000000..3247df5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+
+// fn textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
+fn textureDimensions_9393b0() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9393b0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9393b0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9393b0();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9393b0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9393b0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl
new file mode 100644
index 0000000..9852d37
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+
+// fn textureDimensions(texture: texture_depth_2d) -> vec2<i32>
+fn textureDimensions_939fdb() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_939fdb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_939fdb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_939fdb();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/939fdb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/939fdb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl
new file mode 100644
index 0000000..fddb828
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<i32>;
+
+// fn textureDimensions(texture: texture_cube<i32>) -> vec2<i32>
+fn textureDimensions_962dcd() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_962dcd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_962dcd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_962dcd();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/962dcd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/962dcd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl
new file mode 100644
index 0000000..4fea70c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba32float, write>) -> vec2<i32>
+fn textureDimensions_9abfe5() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9abfe5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9abfe5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9abfe5();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9abfe5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9abfe5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl
new file mode 100644
index 0000000..93cee59
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
+
+// fn textureDimensions(texture: texture_2d_array<i32>, level: i32) -> vec2<i32>
+fn textureDimensions_9c9c57() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9c9c57();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9c9c57();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9c9c57();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9c9c57.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9c9c57.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl
new file mode 100644
index 0000000..05e9f02
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba8sint, write>) -> i32
+fn textureDimensions_9da9e2() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9da9e2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9da9e2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9da9e2();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.glsl
new file mode 100644
index 0000000..5773b40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_9da9e2() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_9da9e2();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_9da9e2() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_9da9e2();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_9da9e2() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_9da9e2();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9da9e2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl
new file mode 100644
index 0000000..8a3f461
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<r32uint, write>) -> vec2<i32>
+fn textureDimensions_9eb8d8() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9eb8d8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9eb8d8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9eb8d8();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9eb8d8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl
new file mode 100644
index 0000000..c2caccf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+
+// fn textureDimensions(texture: texture_2d<f32>) -> vec2<i32>
+fn textureDimensions_9f8e46() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_9f8e46();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_9f8e46();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_9f8e46();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/9f8e46.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/9f8e46.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl
new file mode 100644
index 0000000..96e2e3e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+
+// fn textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
+fn textureDimensions_a01845() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_a01845();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_a01845();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_a01845();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.glsl
new file mode 100644
index 0000000..5be0e3e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_a01845() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_a01845();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_a01845() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_a01845();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureDimensions_a01845() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_a01845();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/a01845.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl
new file mode 100644
index 0000000..2559f77
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
+
+// fn textureDimensions(texture: texture_1d<u32>) -> i32
+fn textureDimensions_a7d565() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_a7d565();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_a7d565();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_a7d565();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.glsl
new file mode 100644
index 0000000..24152c7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureDimensions_a7d565() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_a7d565();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler1D arg_0_1;
+void textureDimensions_a7d565() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void fragment_main() {
+  textureDimensions_a7d565();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureDimensions_a7d565() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void compute_main() {
+  textureDimensions_a7d565();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/a7d565.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl
new file mode 100644
index 0000000..d88716e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<r32float, write>) -> i32
+fn textureDimensions_a863f2() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_a863f2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_a863f2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_a863f2();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.glsl
new file mode 100644
index 0000000..b157dd9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(r32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_a863f2() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_a863f2();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(r32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_a863f2() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_a863f2();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(r32f) uniform highp writeonly image1D arg_0;
+void textureDimensions_a863f2() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_a863f2();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/a863f2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl
new file mode 100644
index 0000000..dfc5978
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+
+// fn textureDimensions(texture: texture_cube<f32>, level: i32) -> vec2<i32>
+fn textureDimensions_a9c9c1() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_a9c9c1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_a9c9c1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_a9c9c1();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/a9c9c1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl
new file mode 100644
index 0000000..98b443a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
+
+// fn textureDimensions(texture: texture_2d<i32>, level: i32) -> vec2<i32>
+fn textureDimensions_b0e16d() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_b0e16d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_b0e16d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_b0e16d();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b0e16d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/b0e16d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl
new file mode 100644
index 0000000..2fb0e3d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<u32>;
+
+// fn textureDimensions(texture: texture_cube<u32>) -> vec2<i32>
+fn textureDimensions_b3c954() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_b3c954();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_b3c954();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_b3c954();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3c954.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/b3c954.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl
new file mode 100644
index 0000000..47ae776
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
+
+// fn textureDimensions(texture: texture_1d<f32>, level: i32) -> i32
+fn textureDimensions_b3e407() {
+  var res: i32 = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_b3e407();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_b3e407();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_b3e407();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.glsl
new file mode 100644
index 0000000..438d8fb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureDimensions_b3e407() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_b3e407();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler1D arg_0_1;
+void textureDimensions_b3e407() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void fragment_main() {
+  textureDimensions_b3e407();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'sampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureDimensions_b3e407() {
+  int res = textureSize(arg_0_1, 0);
+}
+
+void compute_main() {
+  textureDimensions_b3e407();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/b3e407.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl
new file mode 100644
index 0000000..df6cccb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba8snorm, write>) -> vec2<i32>
+fn textureDimensions_b91240() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_b91240();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_b91240();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_b91240();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/b91240.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/b91240.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl
new file mode 100644
index 0000000..1cb0abe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_external;
+
+// fn textureDimensions(texture: texture_external) -> vec2<i32>
+fn textureDimensions_ba1481() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_ba1481();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_ba1481();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_ba1481();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl
new file mode 100644
index 0000000..fec2488
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba32sint, write>) -> vec3<i32>
+fn textureDimensions_bb3dde() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_bb3dde();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_bb3dde();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_bb3dde();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/bb3dde.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/bb3dde.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl
new file mode 100644
index 0000000..c5afaf3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<r32sint, write>) -> vec2<i32>
+fn textureDimensions_c30e75() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_c30e75();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_c30e75();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_c30e75();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c30e75.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/c30e75.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl
new file mode 100644
index 0000000..892ea87
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<rgba8uint, write>) -> vec2<i32>
+fn textureDimensions_c7943d() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_c7943d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_c7943d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_c7943d();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/c7943d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/c7943d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl
new file mode 100644
index 0000000..42f777f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rg32sint, write>) -> i32
+fn textureDimensions_cc968c() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_cc968c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_cc968c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_cc968c();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.glsl
new file mode 100644
index 0000000..d7f3bec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_cc968c() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_cc968c();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_cc968c() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_cc968c();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage1D arg_0;
+void textureDimensions_cc968c() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_cc968c();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/cc968c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl
new file mode 100644
index 0000000..b320e91
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba8snorm, write>) -> i32
+fn textureDimensions_cccc8f() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_cccc8f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_cccc8f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_cccc8f();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.glsl
new file mode 100644
index 0000000..8ea9b9e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
+void textureDimensions_cccc8f() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_cccc8f();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
+void textureDimensions_cccc8f() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_cccc8f();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
+void textureDimensions_cccc8f() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_cccc8f();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/cccc8f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl
new file mode 100644
index 0000000..8959a17
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba8unorm, write>) -> vec3<i32>
+fn textureDimensions_cd76a7() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_cd76a7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_cd76a7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_cd76a7();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cd76a7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/cd76a7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl
new file mode 100644
index 0000000..3eb0f09
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rgba16sint, write>) -> vec2<i32>
+fn textureDimensions_cdf473() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_cdf473();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_cdf473();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_cdf473();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cdf473.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/cdf473.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl
new file mode 100644
index 0000000..abd76b1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+
+// fn textureDimensions(texture: texture_2d_array<f32>) -> vec2<i32>
+fn textureDimensions_cec841() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_cec841();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_cec841();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_cec841();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cec841.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/cec841.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl
new file mode 100644
index 0000000..8faa148
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba8snorm, write>) -> vec3<i32>
+fn textureDimensions_cf7e43() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_cf7e43();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_cf7e43();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_cf7e43();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/cf7e43.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/cf7e43.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl
new file mode 100644
index 0000000..62a607f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+
+// fn textureDimensions(texture: texture_cube<f32>) -> vec2<i32>
+fn textureDimensions_d125bc() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_d125bc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_d125bc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_d125bc();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d125bc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/d125bc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl
new file mode 100644
index 0000000..e9bf089
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
+
+// fn textureDimensions(texture: texture_cube_array<u32>, level: i32) -> vec2<i32>
+fn textureDimensions_d83c45() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_d83c45();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_d83c45();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_d83c45();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.glsl
new file mode 100644
index 0000000..94aef0c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureDimensions_d83c45() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_d83c45();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureDimensions_d83c45() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_d83c45();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureDimensions_d83c45() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_d83c45();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/d83c45.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl
new file mode 100644
index 0000000..9d66ada
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
+
+// fn textureDimensions(texture: texture_multisampled_2d<i32>) -> vec2<i32>
+fn textureDimensions_daf7c0() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_daf7c0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_daf7c0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_daf7c0();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/daf7c0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/daf7c0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl
new file mode 100644
index 0000000..dd28eb4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
+
+// fn textureDimensions(texture: texture_storage_1d<rgba8uint, write>) -> i32
+fn textureDimensions_dc2dd0() {
+  var res: i32 = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_dc2dd0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_dc2dd0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_dc2dd0();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.glsl
new file mode 100644
index 0000000..3d7ac14
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_dc2dd0() {
+  int res = imageSize(arg_0);
+}
+
+vec4 vertex_main() {
+  textureDimensions_dc2dd0();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_dc2dd0() {
+  int res = imageSize(arg_0);
+}
+
+void fragment_main() {
+  textureDimensions_dc2dd0();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
+void textureDimensions_dc2dd0() {
+  int res = imageSize(arg_0);
+}
+
+void compute_main() {
+  textureDimensions_dc2dd0();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/dc2dd0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl
new file mode 100644
index 0000000..e711cdd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
+
+// fn textureDimensions(texture: texture_cube_array<i32>) -> vec2<i32>
+fn textureDimensions_e927be() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_e927be();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_e927be();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_e927be();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.glsl
new file mode 100644
index 0000000..a476da2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureDimensions_e927be() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_e927be();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureDimensions_e927be() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_e927be();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureDimensions_e927be() {
+  ivec2 res = textureSize(arg_0_1, 0).xy;
+}
+
+void compute_main() {
+  textureDimensions_e927be();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/e927be.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl
new file mode 100644
index 0000000..41b9f1e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<r32float, write>) -> vec2<i32>
+fn textureDimensions_e9e96c() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_e9e96c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_e9e96c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_e9e96c();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/e9e96c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/e9e96c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl
new file mode 100644
index 0000000..b533d38
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
+
+// fn textureDimensions(texture: texture_multisampled_2d<f32>) -> vec2<i32>
+fn textureDimensions_ef5b89() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_ef5b89();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_ef5b89();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_ef5b89();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/ef5b89.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/ef5b89.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl
new file mode 100644
index 0000000..f93caa2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
+
+// fn textureDimensions(texture: texture_3d<i32>, level: i32) -> vec3<i32>
+fn textureDimensions_efc8a4() {
+  var res: vec3<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_efc8a4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_efc8a4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_efc8a4();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/efc8a4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/efc8a4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl
new file mode 100644
index 0000000..167f39a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
+
+// fn textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
+fn textureDimensions_f60bdb() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_f60bdb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_f60bdb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_f60bdb();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f60bdb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/f60bdb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl
new file mode 100644
index 0000000..55ed1c7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
+
+// fn textureDimensions(texture: texture_2d<u32>, level: i32) -> vec2<i32>
+fn textureDimensions_f7145b() {
+  var res: vec2<i32> = textureDimensions(arg_0, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_f7145b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_f7145b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_f7145b();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f7145b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/f7145b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl
new file mode 100644
index 0000000..85c0fab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d<r32float, write>) -> vec2<i32>
+fn textureDimensions_f931c7() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_f931c7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_f931c7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_f931c7();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/f931c7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/f931c7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl
new file mode 100644
index 0000000..206c54e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
+
+// fn textureDimensions(texture: texture_2d<i32>) -> vec2<i32>
+fn textureDimensions_fa9859() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_fa9859();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_fa9859();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_fa9859();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fa9859.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/fa9859.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl
new file mode 100644
index 0000000..fcfb9cf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
+
+// fn textureDimensions(texture: texture_storage_2d_array<rg32float, write>) -> vec2<i32>
+fn textureDimensions_fb5670() {
+  var res: vec2<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_fb5670();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_fb5670();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_fb5670();
+}
diff --git a/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.glsl
new file mode 100644
index 0000000..5c3bd40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureDimensions_fb5670() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+vec4 vertex_main() {
+  textureDimensions_fb5670();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureDimensions_fb5670() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+void fragment_main() {
+  textureDimensions_fb5670();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureDimensions_fb5670() {
+  ivec2 res = imageSize(arg_0).xy;
+}
+
+void compute_main() {
+  textureDimensions_fb5670();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/fb5670.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl
new file mode 100644
index 0000000..7e7c4d8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
+
+// fn textureDimensions(texture: texture_storage_3d<rgba8uint, write>) -> vec3<i32>
+fn textureDimensions_fcac78() {
+  var res: vec3<i32> = textureDimensions(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureDimensions_fcac78();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureDimensions_fcac78();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureDimensions_fcac78();
+}
diff --git a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureDimensions/fcac78.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureDimensions/fcac78.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/01305f.wgsl b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl
new file mode 100644
index 0000000..7ac678b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d_array<u32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d_array<u32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<u32>
+fn textureGather_01305f() {
+  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_01305f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_01305f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_01305f();
+}
diff --git a/test/tint/builtins/gen/textureGather/01305f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/01305f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/01305f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/01305f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/01305f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/01305f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/01305f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/01305f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/01305f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/01305f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/01305f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/06030a.wgsl b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl
new file mode 100644
index 0000000..aad328c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d_array<f32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
+fn textureGather_06030a() {
+  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_06030a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_06030a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_06030a();
+}
diff --git a/test/tint/builtins/gen/textureGather/06030a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/06030a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/06030a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/06030a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/06030a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/06030a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/06030a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/06030a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/06030a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/06030a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/06030a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/10c554.wgsl b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl
new file mode 100644
index 0000000..4f52509
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureGather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
+fn textureGather_10c554() {
+  var res: vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_10c554();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_10c554();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_10c554();
+}
diff --git a/test/tint/builtins/gen/textureGather/10c554.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/10c554.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/10c554.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/10c554.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/10c554.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/10c554.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/10c554.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/10c554.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/10c554.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/10c554.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/10c554.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl
new file mode 100644
index 0000000..75f8157
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d<f32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
+fn textureGather_15d79c() {
+  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_15d79c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_15d79c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_15d79c();
+}
diff --git a/test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/15d79c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/15d79c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl
new file mode 100644
index 0000000..93786c4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
+fn textureGather_2e0ed5() {
+  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_2e0ed5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_2e0ed5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_2e0ed5();
+}
diff --git a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/2e0ed5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/2e0ed5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl
new file mode 100644
index 0000000..8c8de88
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_cube_array<f32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
+fn textureGather_3112e8() {
+  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_3112e8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_3112e8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_3112e8();
+}
diff --git a/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.glsl
new file mode 100644
index 0000000..4853925
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_1_arg_2;
+
+void textureGather_3112e8() {
+  vec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+vec4 vertex_main() {
+  textureGather_3112e8();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_1_arg_2;
+
+void textureGather_3112e8() {
+  vec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+void fragment_main() {
+  textureGather_3112e8();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_1_arg_2;
+
+void textureGather_3112e8() {
+  vec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+void compute_main() {
+  textureGather_3112e8();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/3112e8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl
new file mode 100644
index 0000000..8f68c44
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_cube_array<u32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_cube_array<u32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<u32>
+fn textureGather_3c527e() {
+  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_3c527e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_3c527e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_3c527e();
+}
diff --git a/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.glsl
new file mode 100644
index 0000000..406f5df
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_1_arg_2;
+
+void textureGather_3c527e() {
+  uvec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+vec4 vertex_main() {
+  textureGather_3c527e();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usamplerCubeArray arg_1_arg_2;
+
+void textureGather_3c527e() {
+  uvec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+void fragment_main() {
+  textureGather_3c527e();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_1_arg_2;
+
+void textureGather_3c527e() {
+  uvec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+void compute_main() {
+  textureGather_3c527e();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/3c527e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/43025d.wgsl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl
new file mode 100644
index 0000000..ec5a0b0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureGather(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
+fn textureGather_43025d() {
+  var res: vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_43025d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_43025d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_43025d();
+}
diff --git a/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.glsl
new file mode 100644
index 0000000..bccd8f9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureGather_43025d() {
+  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 0.0);
+}
+
+vec4 vertex_main() {
+  textureGather_43025d();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureGather_43025d() {
+  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 0.0);
+}
+
+void fragment_main() {
+  textureGather_43025d();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureGather_43025d() {
+  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 0.0);
+}
+
+void compute_main() {
+  textureGather_43025d();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/43025d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/43025d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/43025d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/43025d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/43025d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl
new file mode 100644
index 0000000..8ff0bf7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d_array<i32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d_array<i32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<i32>
+fn textureGather_4f2350() {
+  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_4f2350();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_4f2350();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_4f2350();
+}
diff --git a/test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/4f2350.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/4f2350.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl
new file mode 100644
index 0000000..1fdec12
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d_array<i32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d_array<i32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<i32>
+fn textureGather_51cf0b() {
+  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_51cf0b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_51cf0b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_51cf0b();
+}
diff --git a/test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/51cf0b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/51cf0b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl
new file mode 100644
index 0000000..3bcf11a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureGather(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
+fn textureGather_53ece6() {
+  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_53ece6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_53ece6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_53ece6();
+}
diff --git a/test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/53ece6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/53ece6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl
new file mode 100644
index 0000000..4676766
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_cube<f32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
+fn textureGather_57bfc6() {
+  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_57bfc6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_57bfc6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_57bfc6();
+}
diff --git a/test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/57bfc6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/57bfc6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl
new file mode 100644
index 0000000..06c9f40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d<i32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d<i32>, sampler: sampler, coords: vec2<f32>) -> vec4<i32>
+fn textureGather_587ba3() {
+  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_587ba3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_587ba3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_587ba3();
+}
diff --git a/test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/587ba3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/587ba3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl
new file mode 100644
index 0000000..f2dc5cc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d<i32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d<i32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<i32>
+fn textureGather_69e0fb() {
+  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_69e0fb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_69e0fb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_69e0fb();
+}
diff --git a/test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/69e0fb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/69e0fb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/93003d.wgsl b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl
new file mode 100644
index 0000000..54eba98
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d<u32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d<u32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<u32>
+fn textureGather_93003d() {
+  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_93003d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_93003d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_93003d();
+}
diff --git a/test/tint/builtins/gen/textureGather/93003d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/93003d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/93003d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/93003d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/93003d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/93003d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/93003d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/93003d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/93003d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/93003d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/93003d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl
new file mode 100644
index 0000000..d8d2bc5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureGather(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
+fn textureGather_9a6358() {
+  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_9a6358();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_9a6358();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_9a6358();
+}
diff --git a/test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9a6358.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/9a6358.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl
new file mode 100644
index 0000000..3099ce7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d_array<f32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
+fn textureGather_9efca2() {
+  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_9efca2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_9efca2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_9efca2();
+}
diff --git a/test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/9efca2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/9efca2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl
new file mode 100644
index 0000000..2dc3001
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d<f32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
+fn textureGather_bd0b1e() {
+  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_bd0b1e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_bd0b1e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_bd0b1e();
+}
diff --git a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/bd0b1e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/bd0b1e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl
new file mode 100644
index 0000000..f993247
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
+fn textureGather_c409ae() {
+  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_c409ae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_c409ae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_c409ae();
+}
diff --git a/test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c409ae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/c409ae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/c55822.wgsl b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl
new file mode 100644
index 0000000..af96349
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_cube_array<i32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_cube_array<i32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<i32>
+fn textureGather_c55822() {
+  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_c55822();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_c55822();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_c55822();
+}
diff --git a/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.glsl
new file mode 100644
index 0000000..d2c583f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_1_arg_2;
+
+void textureGather_c55822() {
+  ivec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+vec4 vertex_main() {
+  textureGather_c55822();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isamplerCubeArray arg_1_arg_2;
+
+void textureGather_c55822() {
+  ivec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+void fragment_main() {
+  textureGather_c55822();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_1_arg_2;
+
+void textureGather_c55822() {
+  ivec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
+}
+
+void compute_main() {
+  textureGather_c55822();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c55822.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c55822.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c55822.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/c55822.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/c55822.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl
new file mode 100644
index 0000000..148009f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_cube<u32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_cube<u32>, sampler: sampler, coords: vec3<f32>) -> vec4<u32>
+fn textureGather_e1b67d() {
+  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_e1b67d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_e1b67d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_e1b67d();
+}
diff --git a/test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e1b67d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/e1b67d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl
new file mode 100644
index 0000000..8d001a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d<u32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d<u32>, sampler: sampler, coords: vec2<f32>) -> vec4<u32>
+fn textureGather_e9eff6() {
+  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_e9eff6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_e9eff6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_e9eff6();
+}
diff --git a/test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/e9eff6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/e9eff6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl
new file mode 100644
index 0000000..b7886eb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_2d_array<u32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_2d_array<u32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<u32>
+fn textureGather_f5f3ba() {
+  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_f5f3ba();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_f5f3ba();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_f5f3ba();
+}
diff --git a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f5f3ba.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/f5f3ba.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl
new file mode 100644
index 0000000..b811706
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(1) var arg_1: texture_cube<i32>;
+@group(1) @binding(2) var arg_2: sampler;
+
+// fn textureGather(component: i32, texture: texture_cube<i32>, sampler: sampler, coords: vec3<f32>) -> vec4<i32>
+fn textureGather_f7995a() {
+  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGather_f7995a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGather_f7995a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGather_f7995a();
+}
diff --git a/test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGather/f7995a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGather/f7995a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl
new file mode 100644
index 0000000..306361a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureGatherCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32>
+fn textureGatherCompare_182fd4() {
+  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGatherCompare_182fd4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGatherCompare_182fd4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGatherCompare_182fd4();
+}
diff --git a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/182fd4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl
new file mode 100644
index 0000000..55833fd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureGatherCompare(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> vec4<f32>
+fn textureGatherCompare_60d2d1() {
+  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGatherCompare_60d2d1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGatherCompare_60d2d1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGatherCompare_60d2d1();
+}
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.glsl
new file mode 100644
index 0000000..be729a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureGatherCompare_60d2d1() {
+  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+vec4 vertex_main() {
+  textureGatherCompare_60d2d1();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureGatherCompare_60d2d1() {
+  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+void fragment_main() {
+  textureGatherCompare_60d2d1();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureGatherCompare_60d2d1() {
+  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+void compute_main() {
+  textureGatherCompare_60d2d1();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/60d2d1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl
new file mode 100644
index 0000000..56b963b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> vec4<f32>
+fn textureGatherCompare_6d9352() {
+  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGatherCompare_6d9352();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGatherCompare_6d9352();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGatherCompare_6d9352();
+}
diff --git a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6d9352.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl
new file mode 100644
index 0000000..ade1d7a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureGatherCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> vec4<f32>
+fn textureGatherCompare_6f1267() {
+  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGatherCompare_6f1267();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGatherCompare_6f1267();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGatherCompare_6f1267();
+}
diff --git a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/6f1267.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl
new file mode 100644
index 0000000..c78b794
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureGatherCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> vec4<f32>
+fn textureGatherCompare_783e65() {
+  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGatherCompare_783e65();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGatherCompare_783e65();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGatherCompare_783e65();
+}
diff --git a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/783e65.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/783e65.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl
new file mode 100644
index 0000000..f8c05c8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> vec4<f32>
+fn textureGatherCompare_a5f587() {
+  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureGatherCompare_a5f587();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureGatherCompare_a5f587();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureGatherCompare_a5f587();
+}
diff --git a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureGatherCompare/a5f587.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl
new file mode 100644
index 0000000..ed06a24
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+
+// fn textureLoad(texture: texture_depth_2d, coords: vec2<i32>, level: i32) -> f32
+fn textureLoad_19cf87() {
+  var res: f32 = textureLoad(arg_0, vec2<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_19cf87();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_19cf87();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_19cf87();
+}
diff --git a/test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/19cf87.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/19cf87.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl
new file mode 100644
index 0000000..0118959
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
+
+// fn textureLoad(texture: texture_1d<u32>, coords: i32, level: i32) -> vec4<u32>
+fn textureLoad_1b8588() {
+  var res: vec4<u32> = textureLoad(arg_0, 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_1b8588();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_1b8588();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_1b8588();
+}
diff --git a/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.glsl
new file mode 100644
index 0000000..3645132
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureLoad_1b8588() {
+  uvec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+vec4 vertex_main() {
+  textureLoad_1b8588();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler1D arg_0_1;
+void textureLoad_1b8588() {
+  uvec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+void fragment_main() {
+  textureLoad_1b8588();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureLoad_1b8588() {
+  uvec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+void compute_main() {
+  textureLoad_1b8588();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/1b8588.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl
new file mode 100644
index 0000000..edf3989
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+
+// fn textureLoad(texture: texture_3d<f32>, coords: vec3<i32>, level: i32) -> vec4<f32>
+fn textureLoad_1f2016() {
+  var res: vec4<f32> = textureLoad(arg_0, vec3<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_1f2016();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_1f2016();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_1f2016();
+}
diff --git a/test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/1f2016.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/1f2016.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/484344.wgsl b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl
new file mode 100644
index 0000000..08234e1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+
+// fn textureLoad(texture: texture_2d<f32>, coords: vec2<i32>, level: i32) -> vec4<f32>
+fn textureLoad_484344() {
+  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_484344();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_484344();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_484344();
+}
diff --git a/test/tint/builtins/gen/textureLoad/484344.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/484344.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/484344.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/484344.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/484344.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/484344.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/484344.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/484344.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/484344.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/484344.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/484344.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl
new file mode 100644
index 0000000..3aebc0e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
+
+// fn textureLoad(texture: texture_3d<i32>, coords: vec3<i32>, level: i32) -> vec4<i32>
+fn textureLoad_4fd803() {
+  var res: vec4<i32> = textureLoad(arg_0, vec3<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_4fd803();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_4fd803();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_4fd803();
+}
diff --git a/test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/4fd803.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/4fd803.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl
new file mode 100644
index 0000000..c30b067
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
+
+// fn textureLoad(texture: texture_1d<i32>, coords: i32, level: i32) -> vec4<i32>
+fn textureLoad_5a2f9d() {
+  var res: vec4<i32> = textureLoad(arg_0, 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_5a2f9d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_5a2f9d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_5a2f9d();
+}
diff --git a/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.glsl
new file mode 100644
index 0000000..e934bb1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureLoad_5a2f9d() {
+  ivec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+vec4 vertex_main() {
+  textureLoad_5a2f9d();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler1D arg_0_1;
+void textureLoad_5a2f9d() {
+  ivec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+void fragment_main() {
+  textureLoad_5a2f9d();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureLoad_5a2f9d() {
+  ivec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+void compute_main() {
+  textureLoad_5a2f9d();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/5a2f9d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl
new file mode 100644
index 0000000..7a5acec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
+
+// fn textureLoad(texture: texture_2d<u32>, coords: vec2<i32>, level: i32) -> vec4<u32>
+fn textureLoad_6154d4() {
+  var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_6154d4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_6154d4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_6154d4();
+}
diff --git a/test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6154d4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/6154d4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl
new file mode 100644
index 0000000..28389f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
+
+// fn textureLoad(texture: texture_depth_multisampled_2d, coords: vec2<i32>, sample_index: i32) -> f32
+fn textureLoad_6273b1() {
+  var res: f32 = textureLoad(arg_0, vec2<i32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_6273b1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_6273b1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_6273b1();
+}
diff --git a/test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/6273b1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/6273b1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl
new file mode 100644
index 0000000..a6340f6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
+
+// fn textureLoad(texture: texture_2d_array<i32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<i32>
+fn textureLoad_79e697() {
+  var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_79e697();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_79e697();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_79e697();
+}
diff --git a/test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/79e697.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/79e697.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl
new file mode 100644
index 0000000..5399bc0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
+
+// fn textureLoad(texture: texture_2d_array<u32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<u32>
+fn textureLoad_7c90e5() {
+  var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_7c90e5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_7c90e5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_7c90e5();
+}
diff --git a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/7c90e5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/7c90e5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl
new file mode 100644
index 0000000..14e9fce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
+
+// fn textureLoad(texture: texture_1d<f32>, coords: i32, level: i32) -> vec4<f32>
+fn textureLoad_81c381() {
+  var res: vec4<f32> = textureLoad(arg_0, 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_81c381();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_81c381();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_81c381();
+}
diff --git a/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.glsl
new file mode 100644
index 0000000..3063669
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureLoad_81c381() {
+  vec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+vec4 vertex_main() {
+  textureLoad_81c381();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler1D arg_0_1;
+void textureLoad_81c381() {
+  vec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+void fragment_main() {
+  textureLoad_81c381();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'sampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureLoad_81c381() {
+  vec4 res = texelFetch(arg_0_1, 1, 0);
+}
+
+void compute_main() {
+  textureLoad_81c381();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/81c381.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl
new file mode 100644
index 0000000..576da29
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+
+// fn textureLoad(texture: texture_2d_array<f32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<f32>
+fn textureLoad_87be85() {
+  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_87be85();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_87be85();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_87be85();
+}
diff --git a/test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/87be85.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/87be85.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl
new file mode 100644
index 0000000..f1b9767
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_external;
+
+// fn textureLoad(texture: texture_external, coords: vec2<i32>) -> vec4<f32>
+fn textureLoad_8acf41() {
+  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_8acf41();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_8acf41();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_8acf41();
+}
diff --git a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl
new file mode 100644
index 0000000..1e5e98d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl
@@ -0,0 +1,222 @@
+SKIP: FAILED
+
+#version 310 es
+
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+};
+
+layout(binding = 2) uniform ExternalTextureParams_1 {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+} ext_tex_params;
+
+vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
+  bvec3 cond = lessThan(abs(v), vec3(params.D));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
+  return mix(f, t, cond);
+}
+
+vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
+  vec3 color = vec3(0.0f, 0.0f, 0.0f);
+  if ((params.numPlanes == 1u)) {
+    color = texelFetch(plane0_1, coord, 0).rgb;
+  } else {
+    color = (vec4(texelFetch(plane0_1, coord, 0).r, texelFetch(plane1_1, coord, 0).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+  }
+  color = gammaCorrection(color, params.gammaDecodeParams);
+  color = (params.gamutConversionMatrix * color);
+  color = gammaCorrection(color, params.gammaEncodeParams);
+  return vec4(color, 1.0f);
+}
+
+uniform highp sampler2D arg_0_1;
+uniform highp sampler2D ext_tex_plane_1_1;
+void textureLoad_8acf41() {
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params);
+}
+
+vec4 vertex_main() {
+  textureLoad_8acf41();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:53: 'textureLoadExternal' : no matching overloaded function found 
+ERROR: 0:53: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
+ERROR: 0:53: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+};
+
+layout(binding = 2) uniform ExternalTextureParams_1 {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+} ext_tex_params;
+
+vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
+  bvec3 cond = lessThan(abs(v), vec3(params.D));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
+  return mix(f, t, cond);
+}
+
+vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
+  vec3 color = vec3(0.0f, 0.0f, 0.0f);
+  if ((params.numPlanes == 1u)) {
+    color = texelFetch(plane0_1, coord, 0).rgb;
+  } else {
+    color = (vec4(texelFetch(plane0_1, coord, 0).r, texelFetch(plane1_1, coord, 0).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+  }
+  color = gammaCorrection(color, params.gammaDecodeParams);
+  color = (params.gamutConversionMatrix * color);
+  color = gammaCorrection(color, params.gammaEncodeParams);
+  return vec4(color, 1.0f);
+}
+
+uniform highp sampler2D arg_0_1;
+uniform highp sampler2D ext_tex_plane_1_1;
+void textureLoad_8acf41() {
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params);
+}
+
+void fragment_main() {
+  textureLoad_8acf41();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:54: 'textureLoadExternal' : no matching overloaded function found 
+ERROR: 0:54: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
+ERROR: 0:54: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+};
+
+layout(binding = 2) uniform ExternalTextureParams_1 {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+} ext_tex_params;
+
+vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
+  bvec3 cond = lessThan(abs(v), vec3(params.D));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
+  return mix(f, t, cond);
+}
+
+vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
+  vec3 color = vec3(0.0f, 0.0f, 0.0f);
+  if ((params.numPlanes == 1u)) {
+    color = texelFetch(plane0_1, coord, 0).rgb;
+  } else {
+    color = (vec4(texelFetch(plane0_1, coord, 0).r, texelFetch(plane1_1, coord, 0).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+  }
+  color = gammaCorrection(color, params.gammaDecodeParams);
+  color = (params.gamutConversionMatrix * color);
+  color = gammaCorrection(color, params.gammaEncodeParams);
+  return vec4(color, 1.0f);
+}
+
+uniform highp sampler2D arg_0_1;
+uniform highp sampler2D ext_tex_plane_1_1;
+void textureLoad_8acf41() {
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params);
+}
+
+void compute_main() {
+  textureLoad_8acf41();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:53: 'textureLoadExternal' : no matching overloaded function found 
+ERROR: 0:53: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
+ERROR: 0:53: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl
new file mode 100644
index 0000000..decb783
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+
+// fn textureLoad(texture: texture_depth_2d_array, coords: vec2<i32>, array_index: i32, level: i32) -> f32
+fn textureLoad_9b2667() {
+  var res: f32 = textureLoad(arg_0, vec2<i32>(), 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_9b2667();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_9b2667();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_9b2667();
+}
diff --git a/test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/9b2667.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/9b2667.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl
new file mode 100644
index 0000000..951d9f3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
+
+// fn textureLoad(texture: texture_multisampled_2d<f32>, coords: vec2<i32>, sample_index: i32) -> vec4<f32>
+fn textureLoad_a583c9() {
+  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_a583c9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_a583c9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_a583c9();
+}
diff --git a/test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a583c9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/a583c9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl
new file mode 100644
index 0000000..5def05c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
+
+// fn textureLoad(texture: texture_3d<u32>, coords: vec3<i32>, level: i32) -> vec4<u32>
+fn textureLoad_a9a9f5() {
+  var res: vec4<u32> = textureLoad(arg_0, vec3<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_a9a9f5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_a9a9f5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_a9a9f5();
+}
diff --git a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/a9a9f5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/a9a9f5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl
new file mode 100644
index 0000000..2155704
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
+
+// fn textureLoad(texture: texture_2d<i32>, coords: vec2<i32>, level: i32) -> vec4<i32>
+fn textureLoad_c2a480() {
+  var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_c2a480();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_c2a480();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_c2a480();
+}
diff --git a/test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c2a480.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/c2a480.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl
new file mode 100644
index 0000000..39b5713
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
+
+// fn textureLoad(texture: texture_multisampled_2d<u32>, coords: vec2<i32>, sample_index: i32) -> vec4<u32>
+fn textureLoad_c378ee() {
+  var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_c378ee();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_c378ee();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_c378ee();
+}
diff --git a/test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/c378ee.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/c378ee.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl
new file mode 100644
index 0000000..219a31a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
+
+// fn textureLoad(texture: texture_multisampled_2d<i32>, coords: vec2<i32>, sample_index: i32) -> vec4<i32>
+fn textureLoad_e3d2cc() {
+  var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureLoad_e3d2cc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureLoad_e3d2cc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureLoad_e3d2cc();
+}
diff --git a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureLoad/e3d2cc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureLoad/e3d2cc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl
new file mode 100644
index 0000000..ee39dbb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+
+// fn textureNumLayers(texture: texture_2d_array<f32>) -> i32
+fn textureNumLayers_024820() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_024820();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_024820();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_024820();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/024820.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/024820.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl
new file mode 100644
index 0000000..f906fef
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
+
+// fn textureNumLayers(texture: texture_cube_array<u32>) -> i32
+fn textureNumLayers_053df7() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_053df7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_053df7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_053df7();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.glsl
new file mode 100644
index 0000000..e995abb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureNumLayers_053df7() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_053df7();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureNumLayers_053df7() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_053df7();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureNumLayers_053df7() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void compute_main() {
+  textureNumLayers_053df7();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/053df7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl
new file mode 100644
index 0000000..55e7ee0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rg32sint, write>) -> i32
+fn textureNumLayers_058cc3() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_058cc3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_058cc3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_058cc3();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.glsl
new file mode 100644
index 0000000..0730d3a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureNumLayers_058cc3() {
+  int res = imageSize(arg_0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_058cc3();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureNumLayers_058cc3() {
+  int res = imageSize(arg_0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_058cc3();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureNumLayers_058cc3() {
+  int res = imageSize(arg_0).z;
+}
+
+void compute_main() {
+  textureNumLayers_058cc3();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/058cc3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl
new file mode 100644
index 0000000..baf9538
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba8unorm, write>) -> i32
+fn textureNumLayers_09d05d() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_09d05d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_09d05d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_09d05d();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/09d05d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/09d05d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl
new file mode 100644
index 0000000..e21134d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba32sint, write>) -> i32
+fn textureNumLayers_13b4ce() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_13b4ce();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_13b4ce();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_13b4ce();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/13b4ce.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl
new file mode 100644
index 0000000..a74f529
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<r32sint, write>) -> i32
+fn textureNumLayers_22e53b() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_22e53b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_22e53b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_22e53b();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/22e53b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/22e53b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl
new file mode 100644
index 0000000..b6f1c48
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba16float, write>) -> i32
+fn textureNumLayers_562013() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_562013();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_562013();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_562013();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/562013.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/562013.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl
new file mode 100644
index 0000000..d808df9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+
+// fn textureNumLayers(texture: texture_cube_array<f32>) -> i32
+fn textureNumLayers_5d59cd() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_5d59cd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_5d59cd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_5d59cd();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.glsl
new file mode 100644
index 0000000..c469183
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLayers_5d59cd() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_5d59cd();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLayers_5d59cd() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_5d59cd();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLayers_5d59cd() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void compute_main() {
+  textureNumLayers_5d59cd();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/5d59cd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl
new file mode 100644
index 0000000..680221f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba32float, write>) -> i32
+fn textureNumLayers_68a65b() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_68a65b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_68a65b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_68a65b();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/68a65b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/68a65b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl
new file mode 100644
index 0000000..814bad1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+
+// fn textureNumLayers(texture: texture_depth_cube_array) -> i32
+fn textureNumLayers_778bd1() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_778bd1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_778bd1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_778bd1();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.glsl
new file mode 100644
index 0000000..40debcc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLayers_778bd1() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_778bd1();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLayers_778bd1() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_778bd1();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLayers_778bd1() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void compute_main() {
+  textureNumLayers_778bd1();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/778bd1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl
new file mode 100644
index 0000000..7e843bd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rg32float, write>) -> i32
+fn textureNumLayers_7f1937() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_7f1937();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_7f1937();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_7f1937();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.glsl
new file mode 100644
index 0000000..f6fdbf0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureNumLayers_7f1937() {
+  int res = imageSize(arg_0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_7f1937();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureNumLayers_7f1937() {
+  int res = imageSize(arg_0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_7f1937();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureNumLayers_7f1937() {
+  int res = imageSize(arg_0).z;
+}
+
+void compute_main() {
+  textureNumLayers_7f1937();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/7f1937.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl
new file mode 100644
index 0000000..dc95da7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
+
+// fn textureNumLayers(texture: texture_cube_array<i32>) -> i32
+fn textureNumLayers_85f980() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_85f980();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_85f980();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_85f980();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.glsl
new file mode 100644
index 0000000..529bfb3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureNumLayers_85f980() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_85f980();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureNumLayers_85f980() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_85f980();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureNumLayers_85f980() {
+  int res = textureSize(arg_0_1, 0).z;
+}
+
+void compute_main() {
+  textureNumLayers_85f980();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/85f980.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl
new file mode 100644
index 0000000..09bb3e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
+
+// fn textureNumLayers(texture: texture_2d_array<u32>) -> i32
+fn textureNumLayers_87953e() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_87953e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_87953e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_87953e();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/87953e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/87953e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl
new file mode 100644
index 0000000..3431985
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
+
+// fn textureNumLayers(texture: texture_2d_array<i32>) -> i32
+fn textureNumLayers_893e7c() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_893e7c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_893e7c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_893e7c();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/893e7c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/893e7c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl
new file mode 100644
index 0000000..096b3e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba16uint, write>) -> i32
+fn textureNumLayers_9700fb() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_9700fb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_9700fb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_9700fb();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/9700fb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/9700fb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl
new file mode 100644
index 0000000..176205a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba8sint, write>) -> i32
+fn textureNumLayers_a216d2() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_a216d2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_a216d2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_a216d2();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/a216d2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/a216d2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl
new file mode 100644
index 0000000..f99e118
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba32uint, write>) -> i32
+fn textureNumLayers_cd5dc8() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_cd5dc8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_cd5dc8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_cd5dc8();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/cd5dc8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl
new file mode 100644
index 0000000..ba8d85e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<r32float, write>) -> i32
+fn textureNumLayers_d5b228() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_d5b228();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_d5b228();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_d5b228();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/d5b228.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/d5b228.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl
new file mode 100644
index 0000000..fa0eed7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba8snorm, write>) -> i32
+fn textureNumLayers_e31be1() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_e31be1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_e31be1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_e31be1();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e31be1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/e31be1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl
new file mode 100644
index 0000000..4ee178c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+
+// fn textureNumLayers(texture: texture_depth_2d_array) -> i32
+fn textureNumLayers_e653c0() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_e653c0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_e653c0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_e653c0();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/e653c0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/e653c0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl
new file mode 100644
index 0000000..ea1d4a8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<r32uint, write>) -> i32
+fn textureNumLayers_ee942f() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_ee942f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_ee942f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_ee942f();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ee942f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/ee942f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl
new file mode 100644
index 0000000..6445227
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba16sint, write>) -> i32
+fn textureNumLayers_f33005() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_f33005();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_f33005();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_f33005();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/f33005.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/f33005.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl
new file mode 100644
index 0000000..0fef907
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rg32uint, write>) -> i32
+fn textureNumLayers_fcec98() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_fcec98();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_fcec98();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_fcec98();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.glsl
new file mode 100644
index 0000000..bfaa76f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureNumLayers_fcec98() {
+  int res = imageSize(arg_0).z;
+}
+
+vec4 vertex_main() {
+  textureNumLayers_fcec98();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureNumLayers_fcec98() {
+  int res = imageSize(arg_0).z;
+}
+
+void fragment_main() {
+  textureNumLayers_fcec98();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureNumLayers_fcec98() {
+  int res = imageSize(arg_0).z;
+}
+
+void compute_main() {
+  textureNumLayers_fcec98();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/fcec98.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl
new file mode 100644
index 0000000..f12ea65
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
+
+// fn textureNumLayers(texture: texture_storage_2d_array<rgba8uint, write>) -> i32
+fn textureNumLayers_ff5e89() {
+  var res: i32 = textureNumLayers(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLayers_ff5e89();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLayers_ff5e89();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLayers_ff5e89();
+}
diff --git a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLayers/ff5e89.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl
new file mode 100644
index 0000000..96b8e96
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+
+// fn textureNumLevels(texture: texture_depth_cube) -> i32
+fn textureNumLevels_076cb5() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_076cb5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_076cb5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_076cb5();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.glsl
new file mode 100644
index 0000000..6b93674
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCube arg_0_1;
+void textureNumLevels_076cb5() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_076cb5();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCube arg_0_1;
+void textureNumLevels_076cb5() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_076cb5();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCube arg_0_1;
+void textureNumLevels_076cb5() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_076cb5();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/076cb5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl
new file mode 100644
index 0000000..172e090
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<i32>;
+
+// fn textureNumLevels(texture: texture_cube<i32>) -> i32
+fn textureNumLevels_080d95() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_080d95();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_080d95();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_080d95();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.glsl
new file mode 100644
index 0000000..367bb7a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isamplerCube arg_0_1;
+void textureNumLevels_080d95() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_080d95();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isamplerCube arg_0_1;
+void textureNumLevels_080d95() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_080d95();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isamplerCube arg_0_1;
+void textureNumLevels_080d95() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_080d95();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/080d95.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl
new file mode 100644
index 0000000..dea8f54
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
+
+// fn textureNumLevels(texture: texture_2d<u32>) -> i32
+fn textureNumLevels_09ddd0() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_09ddd0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_09ddd0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_09ddd0();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.glsl
new file mode 100644
index 0000000..0691d9b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler2D arg_0_1;
+void textureNumLevels_09ddd0() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_09ddd0();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler2D arg_0_1;
+void textureNumLevels_09ddd0() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_09ddd0();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler2D arg_0_1;
+void textureNumLevels_09ddd0() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_09ddd0();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/09ddd0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl
new file mode 100644
index 0000000..67775fb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+
+// fn textureNumLevels(texture: texture_2d_array<f32>) -> i32
+fn textureNumLevels_105988() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_105988();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_105988();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_105988();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.glsl
new file mode 100644
index 0000000..90e28da
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DArray arg_0_1;
+void textureNumLevels_105988() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_105988();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArray arg_0_1;
+void textureNumLevels_105988() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_105988();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DArray arg_0_1;
+void textureNumLevels_105988() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_105988();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/105988.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl
new file mode 100644
index 0000000..a921b0c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
+
+// fn textureNumLevels(texture: texture_1d<u32>) -> i32
+fn textureNumLevels_1e6f3b() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_1e6f3b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_1e6f3b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_1e6f3b();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.glsl
new file mode 100644
index 0000000..50f6f13
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureNumLevels_1e6f3b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_1e6f3b();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler1D arg_0_1;
+void textureNumLevels_1e6f3b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_1e6f3b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler1D arg_0_1;
+void textureNumLevels_1e6f3b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_1e6f3b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/1e6f3b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl
new file mode 100644
index 0000000..c44baad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
+
+// fn textureNumLevels(texture: texture_2d<i32>) -> i32
+fn textureNumLevels_23f750() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_23f750();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_23f750();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_23f750();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.glsl
new file mode 100644
index 0000000..8b96498
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler2D arg_0_1;
+void textureNumLevels_23f750() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_23f750();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler2D arg_0_1;
+void textureNumLevels_23f750() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_23f750();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler2D arg_0_1;
+void textureNumLevels_23f750() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_23f750();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/23f750.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl
new file mode 100644
index 0000000..e94cb62
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+
+// fn textureNumLevels(texture: texture_depth_cube_array) -> i32
+fn textureNumLevels_2c3575() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_2c3575();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_2c3575();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_2c3575();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.glsl
new file mode 100644
index 0000000..2de59fc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLevels_2c3575() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_2c3575();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLevels_2c3575() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_2c3575();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLevels_2c3575() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_2c3575();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/2c3575.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl
new file mode 100644
index 0000000..d7c7297
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
+
+// fn textureNumLevels(texture: texture_1d<i32>) -> i32
+fn textureNumLevels_32a0ae() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_32a0ae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_32a0ae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_32a0ae();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.glsl
new file mode 100644
index 0000000..b0cdc31
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureNumLevels_32a0ae() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_32a0ae();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler1D arg_0_1;
+void textureNumLevels_32a0ae() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_32a0ae();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler1D arg_0_1;
+void textureNumLevels_32a0ae() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_32a0ae();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/32a0ae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl
new file mode 100644
index 0000000..371315a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
+
+// fn textureNumLevels(texture: texture_2d_array<u32>) -> i32
+fn textureNumLevels_5101cf() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_5101cf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_5101cf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_5101cf();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.glsl
new file mode 100644
index 0000000..e372765
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler2DArray arg_0_1;
+void textureNumLevels_5101cf() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_5101cf();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler2DArray arg_0_1;
+void textureNumLevels_5101cf() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_5101cf();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler2DArray arg_0_1;
+void textureNumLevels_5101cf() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_5101cf();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/5101cf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl
new file mode 100644
index 0000000..de1c30b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
+
+// fn textureNumLevels(texture: texture_1d<f32>) -> i32
+fn textureNumLevels_51b5bb() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_51b5bb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_51b5bb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_51b5bb();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.glsl
new file mode 100644
index 0000000..8969352
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureNumLevels_51b5bb() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_51b5bb();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler1D arg_0_1;
+void textureNumLevels_51b5bb() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_51b5bb();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'sampler1D' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler1D arg_0_1;
+void textureNumLevels_51b5bb() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_51b5bb();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'sampler1D' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/51b5bb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl
new file mode 100644
index 0000000..b4559d8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+
+// fn textureNumLevels(texture: texture_cube<f32>) -> i32
+fn textureNumLevels_897aaf() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_897aaf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_897aaf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_897aaf();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.glsl
new file mode 100644
index 0000000..f7d707e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCube arg_0_1;
+void textureNumLevels_897aaf() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_897aaf();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCube arg_0_1;
+void textureNumLevels_897aaf() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_897aaf();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCube arg_0_1;
+void textureNumLevels_897aaf() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_897aaf();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/897aaf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl
new file mode 100644
index 0000000..75623c2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
+
+// fn textureNumLevels(texture: texture_3d<i32>) -> i32
+fn textureNumLevels_9da7a5() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_9da7a5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_9da7a5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_9da7a5();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.glsl
new file mode 100644
index 0000000..83706c6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler3D arg_0_1;
+void textureNumLevels_9da7a5() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_9da7a5();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler3D arg_0_1;
+void textureNumLevels_9da7a5() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_9da7a5();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler3D arg_0_1;
+void textureNumLevels_9da7a5() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_9da7a5();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/9da7a5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl
new file mode 100644
index 0000000..1f9d9ae
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
+
+// fn textureNumLevels(texture: texture_cube_array<i32>) -> i32
+fn textureNumLevels_a91c03() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_a91c03();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_a91c03();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_a91c03();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.glsl
new file mode 100644
index 0000000..684bc1b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureNumLevels_a91c03() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_a91c03();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureNumLevels_a91c03() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_a91c03();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isamplerCubeArray arg_0_1;
+void textureNumLevels_a91c03() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_a91c03();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/a91c03.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl
new file mode 100644
index 0000000..f28913a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+
+// fn textureNumLevels(texture: texture_cube_array<f32>) -> i32
+fn textureNumLevels_aee7c8() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_aee7c8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_aee7c8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_aee7c8();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.glsl
new file mode 100644
index 0000000..6fbe762
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLevels_aee7c8() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_aee7c8();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLevels_aee7c8() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_aee7c8();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_1;
+void textureNumLevels_aee7c8() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_aee7c8();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/aee7c8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl
new file mode 100644
index 0000000..a03922c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+
+// fn textureNumLevels(texture: texture_depth_2d) -> i32
+fn textureNumLevels_b1b12b() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_b1b12b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_b1b12b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_b1b12b();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.glsl
new file mode 100644
index 0000000..2a2119a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2D arg_0_1;
+void textureNumLevels_b1b12b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_b1b12b();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2D arg_0_1;
+void textureNumLevels_b1b12b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_b1b12b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2D arg_0_1;
+void textureNumLevels_b1b12b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_b1b12b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/b1b12b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl
new file mode 100644
index 0000000..4d81449
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
+
+// fn textureNumLevels(texture: texture_3d<u32>) -> i32
+fn textureNumLevels_b4f5ea() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_b4f5ea();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_b4f5ea();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_b4f5ea();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.glsl
new file mode 100644
index 0000000..a857a8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler3D arg_0_1;
+void textureNumLevels_b4f5ea() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_b4f5ea();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler3D arg_0_1;
+void textureNumLevels_b4f5ea() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_b4f5ea();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler3D arg_0_1;
+void textureNumLevels_b4f5ea() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_b4f5ea();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/b4f5ea.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl
new file mode 100644
index 0000000..e191da8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
+
+// fn textureNumLevels(texture: texture_2d_array<i32>) -> i32
+fn textureNumLevels_d004a9() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_d004a9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_d004a9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_d004a9();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.glsl
new file mode 100644
index 0000000..926ded3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler2DArray arg_0_1;
+void textureNumLevels_d004a9() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_d004a9();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler2DArray arg_0_1;
+void textureNumLevels_d004a9() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_d004a9();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler2DArray arg_0_1;
+void textureNumLevels_d004a9() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_d004a9();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/d004a9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl
new file mode 100644
index 0000000..a058700
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+
+// fn textureNumLevels(texture: texture_3d<f32>) -> i32
+fn textureNumLevels_dca09e() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_dca09e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_dca09e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_dca09e();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.glsl
new file mode 100644
index 0000000..ba0c815
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler3D arg_0_1;
+void textureNumLevels_dca09e() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_dca09e();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler3D arg_0_1;
+void textureNumLevels_dca09e() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_dca09e();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler3D arg_0_1;
+void textureNumLevels_dca09e() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_dca09e();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/dca09e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl
new file mode 100644
index 0000000..782d93a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+
+// fn textureNumLevels(texture: texture_2d<f32>) -> i32
+fn textureNumLevels_e67231() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_e67231();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_e67231();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_e67231();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.glsl
new file mode 100644
index 0000000..5345038
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2D arg_0_1;
+void textureNumLevels_e67231() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_e67231();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2D arg_0_1;
+void textureNumLevels_e67231() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_e67231();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2D arg_0_1;
+void textureNumLevels_e67231() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_e67231();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/e67231.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl
new file mode 100644
index 0000000..d3620a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<u32>;
+
+// fn textureNumLevels(texture: texture_cube<u32>) -> i32
+fn textureNumLevels_ed078b() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_ed078b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_ed078b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_ed078b();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.glsl
new file mode 100644
index 0000000..3293d1e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usamplerCube arg_0_1;
+void textureNumLevels_ed078b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_ed078b();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usamplerCube arg_0_1;
+void textureNumLevels_ed078b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_ed078b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usamplerCube arg_0_1;
+void textureNumLevels_ed078b() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_ed078b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/ed078b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl
new file mode 100644
index 0000000..665436b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
+
+// fn textureNumLevels(texture: texture_cube_array<u32>) -> i32
+fn textureNumLevels_f46ec6() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_f46ec6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_f46ec6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_f46ec6();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.glsl
new file mode 100644
index 0000000..1da3a81
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureNumLevels_f46ec6() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_f46ec6();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureNumLevels_f46ec6() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_f46ec6();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usamplerCubeArray arg_0_1;
+void textureNumLevels_f46ec6() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_f46ec6();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/f46ec6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl
new file mode 100644
index 0000000..0c000af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+
+// fn textureNumLevels(texture: texture_depth_2d_array) -> i32
+fn textureNumLevels_f5828d() {
+  var res: i32 = textureNumLevels(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumLevels_f5828d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumLevels_f5828d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumLevels_f5828d();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.glsl
new file mode 100644
index 0000000..e810a1a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DArray arg_0_1;
+void textureNumLevels_f5828d() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumLevels_f5828d();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArray arg_0_1;
+void textureNumLevels_f5828d() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumLevels_f5828d();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DArray arg_0_1;
+void textureNumLevels_f5828d() {
+  int res = textureQueryLevels(arg_0_1);
+}
+
+void compute_main() {
+  textureNumLevels_f5828d();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumLevels/f5828d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl
new file mode 100644
index 0000000..749d887
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
+
+// fn textureNumSamples(texture: texture_multisampled_2d<f32>) -> i32
+fn textureNumSamples_2c6f14() {
+  var res: i32 = textureNumSamples(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumSamples_2c6f14();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumSamples_2c6f14();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumSamples_2c6f14();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.glsl
new file mode 100644
index 0000000..5abe128
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DMS arg_0_1;
+void textureNumSamples_2c6f14() {
+  int res = textureSamples(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumSamples_2c6f14();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DMS arg_0_1;
+void textureNumSamples_2c6f14() {
+  int res = textureSamples(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumSamples_2c6f14();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DMS arg_0_1;
+void textureNumSamples_2c6f14() {
+  int res = textureSamples(arg_0_1);
+}
+
+void compute_main() {
+  textureNumSamples_2c6f14();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumSamples/2c6f14.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl
new file mode 100644
index 0000000..429e2eb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
+
+// fn textureNumSamples(texture: texture_multisampled_2d<u32>) -> i32
+fn textureNumSamples_42f8bb() {
+  var res: i32 = textureNumSamples(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumSamples_42f8bb();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumSamples_42f8bb();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumSamples_42f8bb();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.glsl
new file mode 100644
index 0000000..8a06334
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp usampler2DMS arg_0_1;
+void textureNumSamples_42f8bb() {
+  int res = textureSamples(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumSamples_42f8bb();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp usampler2DMS arg_0_1;
+void textureNumSamples_42f8bb() {
+  int res = textureSamples(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumSamples_42f8bb();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp usampler2DMS arg_0_1;
+void textureNumSamples_42f8bb() {
+  int res = textureSamples(arg_0_1);
+}
+
+void compute_main() {
+  textureNumSamples_42f8bb();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumSamples/42f8bb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl
new file mode 100644
index 0000000..e5e5baf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
+
+// fn textureNumSamples(texture: texture_multisampled_2d<i32>) -> i32
+fn textureNumSamples_449d23() {
+  var res: i32 = textureNumSamples(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumSamples_449d23();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumSamples_449d23();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumSamples_449d23();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.glsl
new file mode 100644
index 0000000..2b60dd5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp isampler2DMS arg_0_1;
+void textureNumSamples_449d23() {
+  int res = textureSamples(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumSamples_449d23();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp isampler2DMS arg_0_1;
+void textureNumSamples_449d23() {
+  int res = textureSamples(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumSamples_449d23();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp isampler2DMS arg_0_1;
+void textureNumSamples_449d23() {
+  int res = textureSamples(arg_0_1);
+}
+
+void compute_main() {
+  textureNumSamples_449d23();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumSamples/449d23.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl
new file mode 100644
index 0000000..11df4fb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
+
+// fn textureNumSamples(texture: texture_depth_multisampled_2d) -> i32
+fn textureNumSamples_a3c8a0() {
+  var res: i32 = textureNumSamples(arg_0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureNumSamples_a3c8a0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureNumSamples_a3c8a0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureNumSamples_a3c8a0();
+}
diff --git a/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.glsl
new file mode 100644
index 0000000..826c680
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DMS arg_0_1;
+void textureNumSamples_a3c8a0() {
+  int res = textureSamples(arg_0_1);
+}
+
+vec4 vertex_main() {
+  textureNumSamples_a3c8a0();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DMS arg_0_1;
+void textureNumSamples_a3c8a0() {
+  int res = textureSamples(arg_0_1);
+}
+
+void fragment_main() {
+  textureNumSamples_a3c8a0();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DMS arg_0_1;
+void textureNumSamples_a3c8a0() {
+  int res = textureSamples(arg_0_1);
+}
+
+void compute_main() {
+  textureNumSamples_a3c8a0();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
+ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
+ERROR: 0:5: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureNumSamples/a3c8a0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl
new file mode 100644
index 0000000..3175d4d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
+fn textureSample_02aa9b() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_02aa9b();
+}
diff --git a/test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/02aa9b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/02aa9b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl
new file mode 100644
index 0000000..6cc07aa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, offset: vec3<i32>) -> vec4<f32>
+fn textureSample_100dc0() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), vec3<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_100dc0();
+}
diff --git a/test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/100dc0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/100dc0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl
new file mode 100644
index 0000000..5c5d84b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> f32
+fn textureSample_38bbb9() {
+  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_38bbb9();
+}
diff --git a/test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/38bbb9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/38bbb9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl
new file mode 100644
index 0000000..5daa22a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
+fn textureSample_3b50bd() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_3b50bd();
+}
diff --git a/test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/3b50bd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/3b50bd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl
new file mode 100644
index 0000000..6cced5c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
+fn textureSample_4dd1bf() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_4dd1bf();
+}
diff --git a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/4dd1bf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/4dd1bf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/51b514.wgsl b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl
new file mode 100644
index 0000000..eb3715e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
+fn textureSample_51b514() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_51b514();
+}
diff --git a/test/tint/builtins/gen/textureSample/51b514.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/51b514.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/51b514.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/51b514.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/51b514.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/51b514.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/51b514.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/51b514.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/51b514.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/51b514.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/51b514.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/667d76.wgsl b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl
new file mode 100644
index 0000000..d218e9d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> f32
+fn textureSample_667d76() {
+  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_667d76();
+}
diff --git a/test/tint/builtins/gen/textureSample/667d76.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/667d76.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/667d76.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/667d76.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/667d76.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/667d76.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/667d76.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/667d76.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/667d76.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/667d76.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/667d76.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl
new file mode 100644
index 0000000..1cd285f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
+fn textureSample_6717ca() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_6717ca();
+}
diff --git a/test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6717ca.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/6717ca.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl
new file mode 100644
index 0000000..92c97bc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_1d<f32>, sampler: sampler, coords: f32) -> vec4<f32>
+fn textureSample_6e64fb() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_6e64fb();
+}
diff --git a/test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/6e64fb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/6e64fb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl
new file mode 100644
index 0000000..534d9ab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
+fn textureSample_7c3baa() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_7c3baa();
+}
diff --git a/test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7c3baa.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/7c3baa.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl
new file mode 100644
index 0000000..7864e21
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32) -> f32
+fn textureSample_7e9ffd() {
+  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_7e9ffd();
+}
diff --git a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/7e9ffd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/7e9ffd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl
new file mode 100644
index 0000000..8cad693
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> f32
+fn textureSample_8522e7() {
+  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_8522e7();
+}
diff --git a/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.glsl
new file mode 100644
index 0000000..d0c988b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.glsl
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSample_8522e7() {
+  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), ivec2(0));
+}
+
+void fragment_main() {
+  textureSample_8522e7();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:7: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
+ERROR: 0:7: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/8522e7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl
new file mode 100644
index 0000000..cad8d4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> f32
+fn textureSample_c2f4e8() {
+  var res: f32 = textureSample(arg_0, arg_1, vec3<f32>(), 1);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_c2f4e8();
+}
diff --git a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/c2f4e8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/c2f4e8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/e53267.wgsl b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl
new file mode 100644
index 0000000..cacb3e4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
+fn textureSample_e53267() {
+  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_e53267();
+}
diff --git a/test/tint/builtins/gen/textureSample/e53267.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/e53267.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/e53267.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/e53267.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/e53267.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/e53267.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/e53267.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/e53267.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/e53267.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/e53267.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/e53267.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl
new file mode 100644
index 0000000..e57ddde
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32
+fn textureSample_ea7030() {
+  var res: f32 = textureSample(arg_0, arg_1, vec3<f32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSample_ea7030();
+}
diff --git a/test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSample/ea7030.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSample/ea7030.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl
new file mode 100644
index 0000000..a3699e6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
+fn textureSampleBias_53b9f7() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_53b9f7();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/53b9f7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl
new file mode 100644
index 0000000..c4d3ee0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, bias: f32, offset: vec2<i32>) -> vec4<f32>
+fn textureSampleBias_65ac50() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_65ac50();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/65ac50.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/65ac50.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl
new file mode 100644
index 0000000..298ece3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32) -> vec4<f32>
+fn textureSampleBias_6a9113() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_6a9113();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/6a9113.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/6a9113.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl
new file mode 100644
index 0000000..4282899
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, bias: f32) -> vec4<f32>
+fn textureSampleBias_80e579() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_80e579();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/80e579.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/80e579.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl
new file mode 100644
index 0000000..1e615ca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32, offset: vec2<i32>) -> vec4<f32>
+fn textureSampleBias_81c19a() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_81c19a();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/81c19a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/81c19a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl
new file mode 100644
index 0000000..1b17a6d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
+fn textureSampleBias_d3fa1b() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_d3fa1b();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/d3fa1b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl
new file mode 100644
index 0000000..14282ee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32, offset: vec3<i32>) -> vec4<f32>
+fn textureSampleBias_df91bb() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_df91bb();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/df91bb.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/df91bb.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl
new file mode 100644
index 0000000..01eeffa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleBias(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, bias: f32) -> vec4<f32>
+fn textureSampleBias_eed7c4() {
+  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1, 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleBias_eed7c4();
+}
diff --git a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleBias/eed7c4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl
new file mode 100644
index 0000000..d0e2376
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> f32
+fn textureSampleCompare_25fcd1() {
+  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompare_25fcd1();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/25fcd1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl
new file mode 100644
index 0000000..799f5b0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
+fn textureSampleCompare_3a5923() {
+  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompare_3a5923();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/3a5923.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl
new file mode 100644
index 0000000..dda3efb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
+fn textureSampleCompare_63fb83() {
+  var res: f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompare_63fb83();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/63fb83.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl
new file mode 100644
index 0000000..8af7adc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> f32
+fn textureSampleCompare_98b85c() {
+  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompare_98b85c();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.glsl
new file mode 100644
index 0000000..45aa450
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.glsl
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleCompare_98b85c() {
+  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0));
+}
+
+void fragment_main() {
+  textureSampleCompare_98b85c();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:7: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
+ERROR: 0:7: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/98b85c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl
new file mode 100644
index 0000000..1b9c595
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompare(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> f32
+fn textureSampleCompare_a3ca7e() {
+  var res: f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompare_a3ca7e();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/a3ca7e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl
new file mode 100644
index 0000000..1733917
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl
@@ -0,0 +1,36 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> f32
+fn textureSampleCompare_dd431d() {
+  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompare_dd431d();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompare/dd431d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl
new file mode 100644
index 0000000..4ebd76c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompareLevel(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> f32
+fn textureSampleCompareLevel_011a8f() {
+  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleCompareLevel_011a8f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompareLevel_011a8f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleCompareLevel_011a8f();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.glsl
new file mode 100644
index 0000000..ed8868c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleCompareLevel_011a8f() {
+  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0));
+}
+
+vec4 vertex_main() {
+  textureSampleCompareLevel_011a8f();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleCompareLevel_011a8f() {
+  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0));
+}
+
+void fragment_main() {
+  textureSampleCompareLevel_011a8f();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:7: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
+ERROR: 0:7: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleCompareLevel_011a8f() {
+  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0));
+}
+
+void compute_main() {
+  textureSampleCompareLevel_011a8f();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl
new file mode 100644
index 0000000..4473d1e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompareLevel(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> f32
+fn textureSampleCompareLevel_1116ed() {
+  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleCompareLevel_1116ed();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompareLevel_1116ed();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleCompareLevel_1116ed();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl
new file mode 100644
index 0000000..fe74fc9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompareLevel(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
+fn textureSampleCompareLevel_1568e3() {
+  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleCompareLevel_1568e3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompareLevel_1568e3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleCompareLevel_1568e3();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl
new file mode 100644
index 0000000..24c283c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
+fn textureSampleCompareLevel_2ad2b1() {
+  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleCompareLevel_2ad2b1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompareLevel_2ad2b1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleCompareLevel_2ad2b1();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl
new file mode 100644
index 0000000..cb237dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompareLevel(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> f32
+fn textureSampleCompareLevel_4cf3a2() {
+  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleCompareLevel_4cf3a2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompareLevel_4cf3a2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleCompareLevel_4cf3a2();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.glsl
new file mode 100644
index 0000000..5037142
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureSampleCompareLevel_4cf3a2() {
+  float res = texture(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+vec4 vertex_main() {
+  textureSampleCompareLevel_4cf3a2();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureSampleCompareLevel_4cf3a2() {
+  float res = texture(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+void fragment_main() {
+  textureSampleCompareLevel_4cf3a2();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureSampleCompareLevel_4cf3a2() {
+  float res = texture(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+void compute_main() {
+  textureSampleCompareLevel_4cf3a2();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl
new file mode 100644
index 0000000..51e2027
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
+
+// fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> f32
+fn textureSampleCompareLevel_f8121c() {
+  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleCompareLevel_f8121c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleCompareLevel_f8121c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleCompareLevel_f8121c();
+}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl
new file mode 100644
index 0000000..339576d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
+fn textureSampleGrad_21402b() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_21402b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_21402b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_21402b();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/21402b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/21402b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl
new file mode 100644
index 0000000..d4250b1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
+fn textureSampleGrad_2ecd8f() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_2ecd8f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_2ecd8f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_2ecd8f();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/2ecd8f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl
new file mode 100644
index 0000000..63d4fed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
+fn textureSampleGrad_468f88() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_468f88();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_468f88();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_468f88();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/468f88.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/468f88.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl
new file mode 100644
index 0000000..31754e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
+fn textureSampleGrad_521263() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_521263();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_521263();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_521263();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/521263.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/521263.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl
new file mode 100644
index 0000000..91e8a82
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
+fn textureSampleGrad_5312f4() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_5312f4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_5312f4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_5312f4();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/5312f4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl
new file mode 100644
index 0000000..4037fe2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, ddx: vec2<f32>, ddy: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
+fn textureSampleGrad_872f00() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>(), vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_872f00();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_872f00();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_872f00();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/872f00.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/872f00.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl
new file mode 100644
index 0000000..9f92c41
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
+fn textureSampleGrad_e383db() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), 1, vec3<f32>(), vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_e383db();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_e383db();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_e383db();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.glsl
new file mode 100644
index 0000000..43f6aad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_arg_1;
+
+void textureSampleGrad_e383db() {
+  vec4 res = textureGrad(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), vec3(0.0f), vec3(0.0f));
+}
+
+vec4 vertex_main() {
+  textureSampleGrad_e383db();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_arg_1;
+
+void textureSampleGrad_e383db() {
+  vec4 res = textureGrad(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), vec3(0.0f), vec3(0.0f));
+}
+
+void fragment_main() {
+  textureSampleGrad_e383db();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_arg_1;
+
+void textureSampleGrad_e383db() {
+  vec4 res = textureGrad(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), vec3(0.0f), vec3(0.0f));
+}
+
+void compute_main() {
+  textureSampleGrad_e383db();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e383db.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl
new file mode 100644
index 0000000..d833ed4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>, offset: vec3<i32>) -> vec4<f32>
+fn textureSampleGrad_e9a2f7() {
+  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>(), vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleGrad_e9a2f7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleGrad_e9a2f7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleGrad_e9a2f7();
+}
diff --git a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleGrad/e9a2f7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl
new file mode 100644
index 0000000..06116a9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: i32) -> f32
+fn textureSampleLevel_02be59() {
+  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_02be59();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_02be59();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_02be59();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/02be59.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/02be59.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl
new file mode 100644
index 0000000..3065b6e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, level: f32) -> vec4<f32>
+fn textureSampleLevel_0bdd9a() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_0bdd9a();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_0bdd9a();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_0bdd9a();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.glsl
new file mode 100644
index 0000000..22a75bf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_arg_1;
+
+void textureSampleLevel_0bdd9a() {
+  vec4 res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+vec4 vertex_main() {
+  textureSampleLevel_0bdd9a();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArray arg_0_arg_1;
+
+void textureSampleLevel_0bdd9a() {
+  vec4 res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+void fragment_main() {
+  textureSampleLevel_0bdd9a();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArray arg_0_arg_1;
+
+void textureSampleLevel_0bdd9a() {
+  vec4 res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
+}
+
+void compute_main() {
+  textureSampleLevel_0bdd9a();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/0bdd9a.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl
new file mode 100644
index 0000000..583634c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: i32) -> f32
+fn textureSampleLevel_1b0291() {
+  var res: f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_1b0291();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_1b0291();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_1b0291();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.glsl
new file mode 100644
index 0000000..5fddb81
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeShadow arg_0_arg_1;
+
+void textureSampleLevel_1b0291() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, 0.0f), float(0));
+}
+
+vec4 vertex_main() {
+  textureSampleLevel_1b0291();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureLod' : no matching overloaded function found 
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeShadow arg_0_arg_1;
+
+void textureSampleLevel_1b0291() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, 0.0f), float(0));
+}
+
+void fragment_main() {
+  textureSampleLevel_1b0291();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:7: 'textureLod' : no matching overloaded function found 
+ERROR: 0:7: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeShadow arg_0_arg_1;
+
+void textureSampleLevel_1b0291() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, 0.0f), float(0));
+}
+
+void compute_main() {
+  textureSampleLevel_1b0291();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureLod' : no matching overloaded function found 
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/1b0291.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl
new file mode 100644
index 0000000..e998859
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, level: i32) -> f32
+fn textureSampleLevel_1bf73e() {
+  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_1bf73e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_1bf73e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_1bf73e();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.glsl
new file mode 100644
index 0000000..b3a3c22
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_1bf73e() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0));
+}
+
+vec4 vertex_main() {
+  textureSampleLevel_1bf73e();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureLod' : no matching overloaded function found 
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_1bf73e() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0));
+}
+
+void fragment_main() {
+  textureSampleLevel_1bf73e();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:7: 'textureLod' : no matching overloaded function found 
+ERROR: 0:7: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_1bf73e() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0));
+}
+
+void compute_main() {
+  textureSampleLevel_1bf73e();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureLod' : no matching overloaded function found 
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/1bf73e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl
new file mode 100644
index 0000000..a1eec71
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, level: f32) -> vec4<f32>
+fn textureSampleLevel_302be4() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_302be4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_302be4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_302be4();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/302be4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/302be4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl
new file mode 100644
index 0000000..80138d3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: i32, offset: vec2<i32>) -> f32
+fn textureSampleLevel_47daa4() {
+  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_47daa4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_47daa4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_47daa4();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/47daa4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl
new file mode 100644
index 0000000..eee0171
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32, offset: vec2<i32>) -> vec4<f32>
+fn textureSampleLevel_690d95() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_690d95();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_690d95();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_690d95();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/690d95.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/690d95.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl
new file mode 100644
index 0000000..432061a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_external;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
+fn textureSampleLevel_979816() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_979816();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_979816();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_979816();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl
new file mode 100644
index 0000000..f23800a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl
@@ -0,0 +1,225 @@
+SKIP: FAILED
+
+#version 310 es
+
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+};
+
+layout(binding = 3) uniform ExternalTextureParams_1 {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+} ext_tex_params;
+
+vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
+  bvec3 cond = lessThan(abs(v), vec3(params.D));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
+  return mix(f, t, cond);
+}
+
+
+vec4 textureSampleExternal(highp sampler2D plane0_smp, highp sampler2D plane1_smp, vec2 coord, ExternalTextureParams params) {
+  vec3 color = vec3(0.0f, 0.0f, 0.0f);
+  if ((params.numPlanes == 1u)) {
+    color = textureLod(plane0_smp, coord, 0.0f).rgb;
+  } else {
+    color = (vec4(textureLod(plane0_smp, coord, 0.0f).r, textureLod(plane1_smp, coord, 0.0f).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+  }
+  color = gammaCorrection(color, params.gammaDecodeParams);
+  color = (params.gamutConversionMatrix * color);
+  color = gammaCorrection(color, params.gammaEncodeParams);
+  return vec4(color, 1.0f);
+}
+
+uniform highp sampler2D arg_0_arg_1;
+uniform highp sampler2D ext_tex_plane_1_arg_1;
+void textureSampleLevel_979816() {
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params);
+}
+
+vec4 vertex_main() {
+  textureSampleLevel_979816();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:54: 'textureSampleExternal' : no matching overloaded function found 
+ERROR: 0:54: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
+ERROR: 0:54: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+};
+
+layout(binding = 3) uniform ExternalTextureParams_1 {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+} ext_tex_params;
+
+vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
+  bvec3 cond = lessThan(abs(v), vec3(params.D));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
+  return mix(f, t, cond);
+}
+
+
+vec4 textureSampleExternal(highp sampler2D plane0_smp, highp sampler2D plane1_smp, vec2 coord, ExternalTextureParams params) {
+  vec3 color = vec3(0.0f, 0.0f, 0.0f);
+  if ((params.numPlanes == 1u)) {
+    color = textureLod(plane0_smp, coord, 0.0f).rgb;
+  } else {
+    color = (vec4(textureLod(plane0_smp, coord, 0.0f).r, textureLod(plane1_smp, coord, 0.0f).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+  }
+  color = gammaCorrection(color, params.gammaDecodeParams);
+  color = (params.gamutConversionMatrix * color);
+  color = gammaCorrection(color, params.gammaEncodeParams);
+  return vec4(color, 1.0f);
+}
+
+uniform highp sampler2D arg_0_arg_1;
+uniform highp sampler2D ext_tex_plane_1_arg_1;
+void textureSampleLevel_979816() {
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params);
+}
+
+void fragment_main() {
+  textureSampleLevel_979816();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:55: 'textureSampleExternal' : no matching overloaded function found 
+ERROR: 0:55: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
+ERROR: 0:55: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+struct GammaTransferParams {
+  float G;
+  float A;
+  float B;
+  float C;
+  float D;
+  float E;
+  float F;
+  uint padding;
+};
+
+struct ExternalTextureParams {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+};
+
+layout(binding = 3) uniform ExternalTextureParams_1 {
+  uint numPlanes;
+  mat3x4 yuvToRgbConversionMatrix;
+  GammaTransferParams gammaDecodeParams;
+  GammaTransferParams gammaEncodeParams;
+  mat3 gamutConversionMatrix;
+} ext_tex_params;
+
+vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
+  bvec3 cond = lessThan(abs(v), vec3(params.D));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
+  return mix(f, t, cond);
+}
+
+
+vec4 textureSampleExternal(highp sampler2D plane0_smp, highp sampler2D plane1_smp, vec2 coord, ExternalTextureParams params) {
+  vec3 color = vec3(0.0f, 0.0f, 0.0f);
+  if ((params.numPlanes == 1u)) {
+    color = textureLod(plane0_smp, coord, 0.0f).rgb;
+  } else {
+    color = (vec4(textureLod(plane0_smp, coord, 0.0f).r, textureLod(plane1_smp, coord, 0.0f).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+  }
+  color = gammaCorrection(color, params.gammaDecodeParams);
+  color = (params.gamutConversionMatrix * color);
+  color = gammaCorrection(color, params.gammaEncodeParams);
+  return vec4(color, 1.0f);
+}
+
+uniform highp sampler2D arg_0_arg_1;
+uniform highp sampler2D ext_tex_plane_1_arg_1;
+void textureSampleLevel_979816() {
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params);
+}
+
+void compute_main() {
+  textureSampleLevel_979816();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:54: 'textureSampleExternal' : no matching overloaded function found 
+ERROR: 0:54: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
+ERROR: 0:54: '' : compilation terminated 
+ERROR: 3 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl
new file mode 100644
index 0000000..a49142f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32, offset: vec3<i32>) -> vec4<f32>
+fn textureSampleLevel_9bd37b() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_9bd37b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_9bd37b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_9bd37b();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/9bd37b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl
new file mode 100644
index 0000000..fee26c2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, level: f32, offset: vec2<i32>) -> vec4<f32>
+fn textureSampleLevel_a4af26() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_a4af26();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_a4af26();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_a4af26();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/a4af26.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl
new file mode 100644
index 0000000..733ef7b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
+fn textureSampleLevel_abfcc0() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_abfcc0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_abfcc0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_abfcc0();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/abfcc0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl
new file mode 100644
index 0000000..ec0c39b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32, level: i32) -> f32
+fn textureSampleLevel_ae5e39() {
+  var res: f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_ae5e39();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_ae5e39();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_ae5e39();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.glsl
new file mode 100644
index 0000000..d619a9b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_ae5e39() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), float(0));
+}
+
+vec4 vertex_main() {
+  textureSampleLevel_ae5e39();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_ae5e39() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), float(0));
+}
+
+void fragment_main() {
+  textureSampleLevel_ae5e39();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp samplerCubeArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_ae5e39() {
+  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), float(0));
+}
+
+void compute_main() {
+  textureSampleLevel_ae5e39();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/ae5e39.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl
new file mode 100644
index 0000000..d7b2a68
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, level: i32, offset: vec2<i32>) -> f32
+fn textureSampleLevel_ba93b3() {
+  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0, vec2<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_ba93b3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_ba93b3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_ba93b3();
+}
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.glsl
new file mode 100644
index 0000000..033a46a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_ba93b3() {
+  float res = textureLodOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0), ivec2(0));
+}
+
+vec4 vertex_main() {
+  textureSampleLevel_ba93b3();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureLodOffset' : no matching overloaded function found 
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_ba93b3() {
+  float res = textureLodOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0), ivec2(0));
+}
+
+void fragment_main() {
+  textureSampleLevel_ba93b3();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:7: 'textureLodOffset' : no matching overloaded function found 
+ERROR: 0:7: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+uniform highp sampler2DArrayShadow arg_0_arg_1;
+
+void textureSampleLevel_ba93b3() {
+  float res = textureLodOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0), ivec2(0));
+}
+
+void compute_main() {
+  textureSampleLevel_ba93b3();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:6: 'textureLodOffset' : no matching overloaded function found 
+ERROR: 0:6: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/ba93b3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl
new file mode 100644
index 0000000..4b0a19e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
+fn textureSampleLevel_c32df7() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_c32df7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_c32df7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_c32df7();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c32df7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl
new file mode 100644
index 0000000..c4cdb2d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl
@@ -0,0 +1,47 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
+
+// fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32) -> vec4<f32>
+fn textureSampleLevel_c6aca6() {
+  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureSampleLevel_c6aca6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureSampleLevel_c6aca6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureSampleLevel_c6aca6();
+}
diff --git a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureSampleLevel/c6aca6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl
new file mode 100644
index 0000000..4677d18
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba32float, write>, coords: vec2<i32>, value: vec4<f32>)
+fn textureStore_05ce15() {
+  textureStore(arg_0, vec2<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_05ce15();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_05ce15();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_05ce15();
+}
diff --git a/test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/05ce15.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/05ce15.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl
new file mode 100644
index 0000000..e959086
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
+
+// fn textureStore(texture: texture_storage_2d<rg32float, write>, coords: vec2<i32>, value: vec4<f32>)
+fn textureStore_064c7f() {
+  textureStore(arg_0, vec2<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_064c7f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_064c7f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_064c7f();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.glsl
new file mode 100644
index 0000000..855df0f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2D arg_0;
+void textureStore_064c7f() {
+  imageStore(arg_0, ivec2(0), vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_064c7f();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image2D arg_0;
+void textureStore_064c7f() {
+  imageStore(arg_0, ivec2(0), vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_064c7f();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2D arg_0;
+void textureStore_064c7f() {
+  imageStore(arg_0, ivec2(0), vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_064c7f();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/064c7f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/068641.wgsl b/test/tint/builtins/gen/literal/textureStore/068641.wgsl
new file mode 100644
index 0000000..86edaac
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/068641.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba16uint, write>, coords: vec3<i32>, value: vec4<u32>)
+fn textureStore_068641() {
+  textureStore(arg_0, vec3<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_068641();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_068641();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_068641();
+}
diff --git a/test/tint/builtins/gen/textureStore/068641.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/068641.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/068641.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/068641.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/068641.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/068641.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/068641.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/068641.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/068641.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/068641.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/068641.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl
new file mode 100644
index 0000000..53f97f4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
+
+// fn textureStore(texture: texture_storage_2d<r32float, write>, coords: vec2<i32>, value: vec4<f32>)
+fn textureStore_0af6b5() {
+  textureStore(arg_0, vec2<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_0af6b5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_0af6b5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_0af6b5();
+}
diff --git a/test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0af6b5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/0af6b5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl
new file mode 100644
index 0000000..f0100ff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba16uint, write>, coords: vec2<i32>, value: vec4<u32>)
+fn textureStore_0c3dff() {
+  textureStore(arg_0, vec2<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_0c3dff();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_0c3dff();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_0c3dff();
+}
diff --git a/test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/0c3dff.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/0c3dff.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/102722.wgsl b/test/tint/builtins/gen/literal/textureStore/102722.wgsl
new file mode 100644
index 0000000..4c9a7dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/102722.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
+
+// fn textureStore(texture: texture_storage_1d<r32uint, write>, coords: i32, value: vec4<u32>)
+fn textureStore_102722() {
+  textureStore(arg_0, 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_102722();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_102722();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_102722();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.glsl
new file mode 100644
index 0000000..0951b51
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(r32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_102722() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_102722();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(r32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_102722() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_102722();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(r32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_102722() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_102722();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/102722.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/102722.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/102722.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/102722.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/102722.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/102722.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/102722.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/102722.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/102722.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl
new file mode 100644
index 0000000..b52633a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba8unorm, write>, coords: vec3<i32>, value: vec4<f32>)
+fn textureStore_1bbd08() {
+  textureStore(arg_0, vec3<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_1bbd08();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_1bbd08();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_1bbd08();
+}
diff --git a/test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1bbd08.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/1bbd08.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl
new file mode 100644
index 0000000..a91041c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<r32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
+fn textureStore_1c02e7() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_1c02e7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_1c02e7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_1c02e7();
+}
diff --git a/test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/1c02e7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/1c02e7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/22d955.wgsl b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl
new file mode 100644
index 0000000..5e6f372
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba8uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
+fn textureStore_22d955() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_22d955();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_22d955();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_22d955();
+}
diff --git a/test/tint/builtins/gen/textureStore/22d955.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/22d955.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/22d955.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/22d955.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/22d955.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/22d955.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/22d955.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/22d955.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/22d955.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/22d955.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/22d955.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl
new file mode 100644
index 0000000..8cb6f1e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba32uint, write>, coords: vec2<i32>, value: vec4<u32>)
+fn textureStore_26bf70() {
+  textureStore(arg_0, vec2<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_26bf70();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_26bf70();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_26bf70();
+}
diff --git a/test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/26bf70.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/26bf70.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl
new file mode 100644
index 0000000..82ce365
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rg32sint, write>, coords: vec3<i32>, value: vec4<i32>)
+fn textureStore_2796b4() {
+  textureStore(arg_0, vec3<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_2796b4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_2796b4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_2796b4();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.glsl
new file mode 100644
index 0000000..7c2a380
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage3D arg_0;
+void textureStore_2796b4() {
+  imageStore(arg_0, ivec3(0), ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_2796b4();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage3D arg_0;
+void textureStore_2796b4() {
+  imageStore(arg_0, ivec3(0), ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_2796b4();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage3D arg_0;
+void textureStore_2796b4() {
+  imageStore(arg_0, ivec3(0), ivec4(0));
+}
+
+void compute_main() {
+  textureStore_2796b4();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/2796b4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl
new file mode 100644
index 0000000..39eebf3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
+
+// fn textureStore(texture: texture_storage_1d<r32float, write>, coords: i32, value: vec4<f32>)
+fn textureStore_2ac6c7() {
+  textureStore(arg_0, 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_2ac6c7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_2ac6c7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_2ac6c7();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.glsl
new file mode 100644
index 0000000..f268014
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(r32f) uniform highp writeonly image1D arg_0;
+void textureStore_2ac6c7() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_2ac6c7();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(r32f) uniform highp writeonly image1D arg_0;
+void textureStore_2ac6c7() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_2ac6c7();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(r32f) uniform highp writeonly image1D arg_0;
+void textureStore_2ac6c7() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_2ac6c7();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/2ac6c7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl
new file mode 100644
index 0000000..05df4c8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba16uint, write>, coords: i32, value: vec4<u32>)
+fn textureStore_2eb2a4() {
+  textureStore(arg_0, 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_2eb2a4();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_2eb2a4();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_2eb2a4();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.glsl
new file mode 100644
index 0000000..2564492
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_2eb2a4() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_2eb2a4();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_2eb2a4() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_2eb2a4();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_2eb2a4() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_2eb2a4();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/2eb2a4.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl
new file mode 100644
index 0000000..9520984
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba8snorm, write>, coords: i32, value: vec4<f32>)
+fn textureStore_2ed2a3() {
+  textureStore(arg_0, 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_2ed2a3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_2ed2a3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_2ed2a3();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.glsl
new file mode 100644
index 0000000..2500adf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
+void textureStore_2ed2a3() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_2ed2a3();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
+void textureStore_2ed2a3() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_2ed2a3();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
+void textureStore_2ed2a3() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_2ed2a3();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/2ed2a3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/31745b.wgsl b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl
new file mode 100644
index 0000000..f26b550
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rg32sint, write>, coords: vec2<i32>, value: vec4<i32>)
+fn textureStore_31745b() {
+  textureStore(arg_0, vec2<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_31745b();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_31745b();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_31745b();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.glsl
new file mode 100644
index 0000000..a475f22
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2D arg_0;
+void textureStore_31745b() {
+  imageStore(arg_0, ivec2(0), ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_31745b();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage2D arg_0;
+void textureStore_31745b() {
+  imageStore(arg_0, ivec2(0), ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_31745b();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2D arg_0;
+void textureStore_31745b() {
+  imageStore(arg_0, ivec2(0), ivec4(0));
+}
+
+void compute_main() {
+  textureStore_31745b();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/31745b.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/31745b.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/31745b.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/31745b.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/31745b.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/32f368.wgsl b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl
new file mode 100644
index 0000000..33b9e04
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba16float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
+fn textureStore_32f368() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_32f368();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_32f368();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_32f368();
+}
diff --git a/test/tint/builtins/gen/textureStore/32f368.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/32f368.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/32f368.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/32f368.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/32f368.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/32f368.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/32f368.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/32f368.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/32f368.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/32f368.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/32f368.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/331aee.wgsl b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl
new file mode 100644
index 0000000..1099995
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba32float, write>, coords: vec3<i32>, value: vec4<f32>)
+fn textureStore_331aee() {
+  textureStore(arg_0, vec3<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_331aee();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_331aee();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_331aee();
+}
diff --git a/test/tint/builtins/gen/textureStore/331aee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/331aee.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/331aee.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/331aee.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/331aee.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/331aee.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/331aee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/331aee.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/331aee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/331aee.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/331aee.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl
new file mode 100644
index 0000000..68b8504
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<r32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
+fn textureStore_38e8d7() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_38e8d7();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_38e8d7();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_38e8d7();
+}
diff --git a/test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/38e8d7.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/38e8d7.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl
new file mode 100644
index 0000000..bce15d4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba16sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
+fn textureStore_3a52ac() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_3a52ac();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_3a52ac();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_3a52ac();
+}
diff --git a/test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3a52ac.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/3a52ac.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl
new file mode 100644
index 0000000..973de1b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<r32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
+fn textureStore_3bb7a1() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_3bb7a1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_3bb7a1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_3bb7a1();
+}
diff --git a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bb7a1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/3bb7a1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl
new file mode 100644
index 0000000..1c7fe6a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba8uint, write>, coords: i32, value: vec4<u32>)
+fn textureStore_3bec15() {
+  textureStore(arg_0, 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_3bec15();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_3bec15();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_3bec15();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.glsl
new file mode 100644
index 0000000..8f0f990
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_3bec15() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_3bec15();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_3bec15() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_3bec15();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_3bec15() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_3bec15();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/3bec15.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl
new file mode 100644
index 0000000..9669e51
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba32uint, write>, coords: vec3<i32>, value: vec4<u32>)
+fn textureStore_441ba8() {
+  textureStore(arg_0, vec3<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_441ba8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_441ba8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_441ba8();
+}
diff --git a/test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/441ba8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/441ba8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl
new file mode 100644
index 0000000..23c5849
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba8snorm, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
+fn textureStore_4fc057() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_4fc057();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_4fc057();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_4fc057();
+}
diff --git a/test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/4fc057.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/4fc057.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl
new file mode 100644
index 0000000..f0ceb8f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba16sint, write>, coords: i32, value: vec4<i32>)
+fn textureStore_5a2f8f() {
+  textureStore(arg_0, 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_5a2f8f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_5a2f8f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_5a2f8f();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.glsl
new file mode 100644
index 0000000..1880046
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba16i) uniform highp writeonly iimage1D arg_0;
+void textureStore_5a2f8f() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_5a2f8f();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba16i) uniform highp writeonly iimage1D arg_0;
+void textureStore_5a2f8f() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_5a2f8f();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba16i) uniform highp writeonly iimage1D arg_0;
+void textureStore_5a2f8f() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void compute_main() {
+  textureStore_5a2f8f();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/5a2f8f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/60975f.wgsl b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl
new file mode 100644
index 0000000..8ad1e46
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba8unorm, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
+fn textureStore_60975f() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_60975f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_60975f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_60975f();
+}
diff --git a/test/tint/builtins/gen/textureStore/60975f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/60975f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/60975f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/60975f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/60975f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/60975f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/60975f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/60975f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/60975f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/60975f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/60975f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl
new file mode 100644
index 0000000..fefa207
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rg32uint, write>, coords: vec2<i32>, value: vec4<u32>)
+fn textureStore_682fd6() {
+  textureStore(arg_0, vec2<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_682fd6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_682fd6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_682fd6();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.glsl
new file mode 100644
index 0000000..8b99c50
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2D arg_0;
+void textureStore_682fd6() {
+  imageStore(arg_0, ivec2(0), uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_682fd6();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage2D arg_0;
+void textureStore_682fd6() {
+  imageStore(arg_0, ivec2(0), uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_682fd6();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2D arg_0;
+void textureStore_682fd6() {
+  imageStore(arg_0, ivec2(0), uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_682fd6();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/682fd6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl
new file mode 100644
index 0000000..ebceb55
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba32float, write>, coords: i32, value: vec4<f32>)
+fn textureStore_6b75c3() {
+  textureStore(arg_0, 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_6b75c3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_6b75c3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_6b75c3();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.glsl
new file mode 100644
index 0000000..8d8e53f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba32f) uniform highp writeonly image1D arg_0;
+void textureStore_6b75c3() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_6b75c3();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba32f) uniform highp writeonly image1D arg_0;
+void textureStore_6b75c3() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_6b75c3();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba32f) uniform highp writeonly image1D arg_0;
+void textureStore_6b75c3() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_6b75c3();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/6b75c3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl
new file mode 100644
index 0000000..ab22858
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
+
+// fn textureStore(texture: texture_storage_1d<r32sint, write>, coords: i32, value: vec4<i32>)
+fn textureStore_6b80d2() {
+  textureStore(arg_0, 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_6b80d2();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_6b80d2();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_6b80d2();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.glsl
new file mode 100644
index 0000000..74eaa9f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(r32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_6b80d2() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_6b80d2();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(r32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_6b80d2() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_6b80d2();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(r32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_6b80d2() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void compute_main() {
+  textureStore_6b80d2();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/6b80d2.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl
new file mode 100644
index 0000000..f00cc00
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
+
+// fn textureStore(texture: texture_storage_2d<r32uint, write>, coords: vec2<i32>, value: vec4<u32>)
+fn textureStore_6cff2e() {
+  textureStore(arg_0, vec2<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_6cff2e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_6cff2e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_6cff2e();
+}
diff --git a/test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6cff2e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/6cff2e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/6da692.wgsl b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl
new file mode 100644
index 0000000..ca7410c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba16uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
+fn textureStore_6da692() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_6da692();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_6da692();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_6da692();
+}
diff --git a/test/tint/builtins/gen/textureStore/6da692.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6da692.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/6da692.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6da692.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/6da692.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6da692.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/6da692.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6da692.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/6da692.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/6da692.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/6da692.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/731349.wgsl b/test/tint/builtins/gen/literal/textureStore/731349.wgsl
new file mode 100644
index 0000000..c8f81d6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/731349.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba8unorm, write>, coords: vec2<i32>, value: vec4<f32>)
+fn textureStore_731349() {
+  textureStore(arg_0, vec2<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_731349();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_731349();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_731349();
+}
diff --git a/test/tint/builtins/gen/textureStore/731349.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/731349.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/731349.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/731349.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/731349.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/731349.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/731349.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/731349.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/731349.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/731349.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/731349.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/752da6.wgsl b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl
new file mode 100644
index 0000000..e2b0734
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba32sint, write>, coords: vec2<i32>, value: vec4<i32>)
+fn textureStore_752da6() {
+  textureStore(arg_0, vec2<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_752da6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_752da6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_752da6();
+}
diff --git a/test/tint/builtins/gen/textureStore/752da6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/752da6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/752da6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/752da6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/752da6.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/752da6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/752da6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/752da6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/752da6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/752da6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/752da6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl
new file mode 100644
index 0000000..a5b9a55
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba8uint, write>, coords: vec2<i32>, value: vec4<u32>)
+fn textureStore_77c0ae() {
+  textureStore(arg_0, vec2<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_77c0ae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_77c0ae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_77c0ae();
+}
diff --git a/test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/77c0ae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/77c0ae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl
new file mode 100644
index 0000000..282ed90
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
+fn textureStore_7cec8d() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_7cec8d();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_7cec8d();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_7cec8d();
+}
diff --git a/test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7cec8d.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/7cec8d.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl
new file mode 100644
index 0000000..8b5d0dd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba8unorm, write>, coords: i32, value: vec4<f32>)
+fn textureStore_7f7fae() {
+  textureStore(arg_0, 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_7f7fae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_7f7fae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_7f7fae();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.glsl
new file mode 100644
index 0000000..33a010e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8) uniform highp writeonly image1D arg_0;
+void textureStore_7f7fae() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_7f7fae();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8) uniform highp writeonly image1D arg_0;
+void textureStore_7f7fae() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_7f7fae();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8) uniform highp writeonly image1D arg_0;
+void textureStore_7f7fae() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_7f7fae();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/7f7fae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/804942.wgsl b/test/tint/builtins/gen/literal/textureStore/804942.wgsl
new file mode 100644
index 0000000..4024631
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/804942.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
+
+// fn textureStore(texture: texture_storage_2d<r32sint, write>, coords: vec2<i32>, value: vec4<i32>)
+fn textureStore_804942() {
+  textureStore(arg_0, vec2<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_804942();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_804942();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_804942();
+}
diff --git a/test/tint/builtins/gen/textureStore/804942.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/804942.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/804942.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/804942.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/804942.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/804942.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/804942.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/804942.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/804942.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/804942.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/804942.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/805dae.wgsl b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl
new file mode 100644
index 0000000..65e4420
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba8snorm, write>, coords: vec2<i32>, value: vec4<f32>)
+fn textureStore_805dae() {
+  textureStore(arg_0, vec2<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_805dae();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_805dae();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_805dae();
+}
diff --git a/test/tint/builtins/gen/textureStore/805dae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/805dae.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/805dae.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/805dae.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/805dae.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/805dae.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/805dae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/805dae.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/805dae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/805dae.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/805dae.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl
new file mode 100644
index 0000000..55d29c6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rg32uint, write>, coords: i32, value: vec4<u32>)
+fn textureStore_83bcc1() {
+  textureStore(arg_0, 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_83bcc1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_83bcc1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_83bcc1();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.glsl
new file mode 100644
index 0000000..b3342f8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_83bcc1() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_83bcc1();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_83bcc1() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_83bcc1();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_83bcc1() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_83bcc1();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/83bcc1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/872747.wgsl b/test/tint/builtins/gen/literal/textureStore/872747.wgsl
new file mode 100644
index 0000000..98ccead
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/872747.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
+
+// fn textureStore(texture: texture_storage_1d<rg32float, write>, coords: i32, value: vec4<f32>)
+fn textureStore_872747() {
+  textureStore(arg_0, 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_872747();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_872747();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_872747();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.glsl
new file mode 100644
index 0000000..3feee78
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image1D arg_0;
+void textureStore_872747() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_872747();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image1D arg_0;
+void textureStore_872747() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_872747();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image1D arg_0;
+void textureStore_872747() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_872747();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/872747.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/872747.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/872747.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/872747.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/872747.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/872747.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/872747.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/872747.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/872747.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl
new file mode 100644
index 0000000..271ed67
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
+fn textureStore_8e0479() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_8e0479();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_8e0479();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_8e0479();
+}
diff --git a/test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8e0479.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/8e0479.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl
new file mode 100644
index 0000000..4d840ce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba16sint, write>, coords: vec3<i32>, value: vec4<i32>)
+fn textureStore_8f71a1() {
+  textureStore(arg_0, vec3<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_8f71a1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_8f71a1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_8f71a1();
+}
diff --git a/test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/8f71a1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/8f71a1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/969534.wgsl b/test/tint/builtins/gen/literal/textureStore/969534.wgsl
new file mode 100644
index 0000000..d73a34d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/969534.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba32sint, write>, coords: i32, value: vec4<i32>)
+fn textureStore_969534() {
+  textureStore(arg_0, 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_969534();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_969534();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_969534();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.glsl
new file mode 100644
index 0000000..793221f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_969534() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_969534();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_969534() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_969534();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_969534() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void compute_main() {
+  textureStore_969534();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/969534.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/969534.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/969534.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/969534.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/969534.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/969534.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/969534.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/969534.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/969534.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl
new file mode 100644
index 0000000..72656e1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba32sint, write>, coords: vec3<i32>, value: vec4<i32>)
+fn textureStore_9a3ecc() {
+  textureStore(arg_0, vec3<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_9a3ecc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_9a3ecc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_9a3ecc();
+}
diff --git a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9a3ecc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/9a3ecc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl
new file mode 100644
index 0000000..484a3cd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
+fn textureStore_9d9cd5() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_9d9cd5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_9d9cd5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_9d9cd5();
+}
diff --git a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9d9cd5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/9d9cd5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl
new file mode 100644
index 0000000..da9282e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba16sint, write>, coords: vec2<i32>, value: vec4<i32>)
+fn textureStore_9e3ec5() {
+  textureStore(arg_0, vec2<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_9e3ec5();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_9e3ec5();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_9e3ec5();
+}
diff --git a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/9e3ec5.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/9e3ec5.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl
new file mode 100644
index 0000000..42d2b30
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rg32uint, write>, coords: vec3<i32>, value: vec4<u32>)
+fn textureStore_ac67aa() {
+  textureStore(arg_0, vec3<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_ac67aa();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_ac67aa();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_ac67aa();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.glsl
new file mode 100644
index 0000000..5662bc9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage3D arg_0;
+void textureStore_ac67aa() {
+  imageStore(arg_0, ivec3(0), uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_ac67aa();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage3D arg_0;
+void textureStore_ac67aa() {
+  imageStore(arg_0, ivec3(0), uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_ac67aa();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage3D arg_0;
+void textureStore_ac67aa() {
+  imageStore(arg_0, ivec3(0), uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_ac67aa();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/ac67aa.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl
new file mode 100644
index 0000000..949c932
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba8sint, write>, coords: vec3<i32>, value: vec4<i32>)
+fn textureStore_b706b1() {
+  textureStore(arg_0, vec3<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_b706b1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_b706b1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_b706b1();
+}
diff --git a/test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/b706b1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/b706b1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl
new file mode 100644
index 0000000..ee04924
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba8sint, write>, coords: vec2<i32>, value: vec4<i32>)
+fn textureStore_bbcb7f() {
+  textureStore(arg_0, vec2<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_bbcb7f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_bbcb7f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_bbcb7f();
+}
diff --git a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bbcb7f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/bbcb7f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl
new file mode 100644
index 0000000..c192581
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
+
+// fn textureStore(texture: texture_storage_2d<rgba16float, write>, coords: vec2<i32>, value: vec4<f32>)
+fn textureStore_be6e30() {
+  textureStore(arg_0, vec2<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_be6e30();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_be6e30();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_be6e30();
+}
diff --git a/test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/be6e30.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/be6e30.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl
new file mode 100644
index 0000000..e8a7f14
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba8sint, write>, coords: i32, value: vec4<i32>)
+fn textureStore_bf775c() {
+  textureStore(arg_0, 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_bf775c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_bf775c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_bf775c();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.glsl
new file mode 100644
index 0000000..892ebea
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba8i) uniform highp writeonly iimage1D arg_0;
+void textureStore_bf775c() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_bf775c();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba8i) uniform highp writeonly iimage1D arg_0;
+void textureStore_bf775c() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_bf775c();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'iimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba8i) uniform highp writeonly iimage1D arg_0;
+void textureStore_bf775c() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void compute_main() {
+  textureStore_bf775c();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'iimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/bf775c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl
new file mode 100644
index 0000000..716f491
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba16float, write>, coords: vec3<i32>, value: vec4<f32>)
+fn textureStore_c5af1e() {
+  textureStore(arg_0, vec3<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_c5af1e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_c5af1e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_c5af1e();
+}
diff --git a/test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c5af1e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/c5af1e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/c863be.wgsl b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl
new file mode 100644
index 0000000..abb287f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rg32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
+fn textureStore_c863be() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_c863be();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_c863be();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_c863be();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.glsl
new file mode 100644
index 0000000..fb070a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureStore_c863be() {
+  imageStore(arg_0, ivec3(0, 0, 1), vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_c863be();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureStore_c863be() {
+  imageStore(arg_0, ivec3(0, 0, 1), vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_c863be();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image2DArray arg_0;
+void textureStore_c863be() {
+  imageStore(arg_0, ivec3(0, 0, 1), vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_c863be();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c863be.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c863be.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c863be.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/c863be.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/c863be.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl
new file mode 100644
index 0000000..44468a8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rg32sint, write>, coords: i32, value: vec4<i32>)
+fn textureStore_d73b5c() {
+  textureStore(arg_0, 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_d73b5c();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_d73b5c();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_d73b5c();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.glsl
new file mode 100644
index 0000000..494b6a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_d73b5c() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_d73b5c();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_d73b5c() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_d73b5c();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage1D arg_0;
+void textureStore_d73b5c() {
+  imageStore(arg_0, 1, ivec4(0));
+}
+
+void compute_main() {
+  textureStore_d73b5c();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/d73b5c.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl
new file mode 100644
index 0000000..8ea8125
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba8snorm, write>, coords: vec3<i32>, value: vec4<f32>)
+fn textureStore_dd7d81() {
+  textureStore(arg_0, vec3<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_dd7d81();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_dd7d81();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_dd7d81();
+}
diff --git a/test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dd7d81.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/dd7d81.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/dde364.wgsl b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl
new file mode 100644
index 0000000..e09a8e5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rg32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
+fn textureStore_dde364() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_dde364();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_dde364();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_dde364();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.glsl
new file mode 100644
index 0000000..cff2439
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureStore_dde364() {
+  imageStore(arg_0, ivec3(0, 0, 1), uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_dde364();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureStore_dde364() {
+  imageStore(arg_0, ivec3(0, 0, 1), uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_dde364();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
+void textureStore_dde364() {
+  imageStore(arg_0, ivec3(0, 0, 1), uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_dde364();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dde364.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dde364.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dde364.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/dde364.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/dde364.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl
new file mode 100644
index 0000000..a6706d5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba16float, write>, coords: i32, value: vec4<f32>)
+fn textureStore_e885e8() {
+  textureStore(arg_0, 1, vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_e885e8();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_e885e8();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_e885e8();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.glsl
new file mode 100644
index 0000000..b537ea3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba16f) uniform highp writeonly image1D arg_0;
+void textureStore_e885e8() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_e885e8();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba16f) uniform highp writeonly image1D arg_0;
+void textureStore_e885e8() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_e885e8();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba16f) uniform highp writeonly image1D arg_0;
+void textureStore_e885e8() {
+  imageStore(arg_0, 1, vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_e885e8();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/e885e8.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl
new file mode 100644
index 0000000..916fc32
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
+
+// fn textureStore(texture: texture_storage_3d<r32float, write>, coords: vec3<i32>, value: vec4<f32>)
+fn textureStore_eb702f() {
+  textureStore(arg_0, vec3<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_eb702f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_eb702f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_eb702f();
+}
diff --git a/test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb702f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/eb702f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl
new file mode 100644
index 0000000..6d0e377
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
+
+// fn textureStore(texture: texture_storage_3d<r32sint, write>, coords: vec3<i32>, value: vec4<i32>)
+fn textureStore_eb78b9() {
+  textureStore(arg_0, vec3<i32>(), vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_eb78b9();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_eb78b9();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_eb78b9();
+}
diff --git a/test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/eb78b9.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/eb78b9.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl
new file mode 100644
index 0000000..a5b15c1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
+
+// fn textureStore(texture: texture_storage_3d<rg32float, write>, coords: vec3<i32>, value: vec4<f32>)
+fn textureStore_ee6acc() {
+  textureStore(arg_0, vec3<i32>(), vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_ee6acc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_ee6acc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_ee6acc();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.glsl
new file mode 100644
index 0000000..b22d596
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image3D arg_0;
+void textureStore_ee6acc() {
+  imageStore(arg_0, ivec3(0), vec4(0.0f));
+}
+
+vec4 vertex_main() {
+  textureStore_ee6acc();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32f) uniform highp writeonly image3D arg_0;
+void textureStore_ee6acc() {
+  imageStore(arg_0, ivec3(0), vec4(0.0f));
+}
+
+void fragment_main() {
+  textureStore_ee6acc();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32f) uniform highp writeonly image3D arg_0;
+void textureStore_ee6acc() {
+  imageStore(arg_0, ivec3(0), vec4(0.0f));
+}
+
+void compute_main() {
+  textureStore_ee6acc();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/ee6acc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl
new file mode 100644
index 0000000..b3effb6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
+
+// fn textureStore(texture: texture_storage_3d<r32uint, write>, coords: vec3<i32>, value: vec4<u32>)
+fn textureStore_ef9f2f() {
+  textureStore(arg_0, vec3<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_ef9f2f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_ef9f2f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_ef9f2f();
+}
diff --git a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/ef9f2f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/ef9f2f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl
new file mode 100644
index 0000000..b49ebc3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
+
+// fn textureStore(texture: texture_storage_3d<rgba8uint, write>, coords: vec3<i32>, value: vec4<u32>)
+fn textureStore_f8dead() {
+  textureStore(arg_0, vec3<i32>(), vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_f8dead();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_f8dead();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_f8dead();
+}
diff --git a/test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f8dead.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/f8dead.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl
new file mode 100644
index 0000000..cb34f7a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rg32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
+fn textureStore_f9be83() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_f9be83();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_f9be83();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_f9be83();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.glsl
new file mode 100644
index 0000000..da09ede
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.glsl
@@ -0,0 +1,75 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureStore_f9be83() {
+  imageStore(arg_0, ivec3(0, 0, 1), ivec4(0));
+}
+
+vec4 vertex_main() {
+  textureStore_f9be83();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureStore_f9be83() {
+  imageStore(arg_0, ivec3(0, 0, 1), ivec4(0));
+}
+
+void fragment_main() {
+  textureStore_f9be83();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'image load-store format' : not supported with this profile: es
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
+void textureStore_f9be83() {
+  imageStore(arg_0, ivec3(0, 0, 1), ivec4(0));
+}
+
+void compute_main() {
+  textureStore_f9be83();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'image load-store format' : not supported with this profile: es
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/f9be83.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl
new file mode 100644
index 0000000..fa69110
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
+
+// fn textureStore(texture: texture_storage_1d<rgba32uint, write>, coords: i32, value: vec4<u32>)
+fn textureStore_fb9a8f() {
+  textureStore(arg_0, 1, vec4<u32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_fb9a8f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_fb9a8f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_fb9a8f();
+}
diff --git a/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.glsl
new file mode 100644
index 0000000..9583078
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.glsl
@@ -0,0 +1,78 @@
+SKIP: FAILED
+
+#version 310 es
+
+layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_fb9a8f() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+vec4 vertex_main() {
+  textureStore_fb9a8f();
+  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;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+precision mediump float;
+
+layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_fb9a8f() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void fragment_main() {
+  textureStore_fb9a8f();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:4: 'uimage1D' : Reserved word. 
+WARNING: 0:4: 'layout' : useless application of layout qualifier 
+ERROR: 0:4: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
+#version 310 es
+
+layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
+void textureStore_fb9a8f() {
+  imageStore(arg_0, 1, uvec4(0u));
+}
+
+void compute_main() {
+  textureStore_fb9a8f();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}
+Error parsing GLSL shader:
+ERROR: 0:3: 'uimage1D' : Reserved word. 
+WARNING: 0:3: 'layout' : useless application of layout qualifier 
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+
diff --git a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/fb9a8f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl
new file mode 100644
index 0000000..541f45c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl
@@ -0,0 +1,46 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
+
+// fn textureStore(texture: texture_storage_2d_array<rgba8sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
+fn textureStore_fbf53f() {
+  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  textureStore_fbf53f();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  textureStore_fbf53f();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  textureStore_fbf53f();
+}
diff --git a/test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/textureStore/fbf53f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/textureStore/fbf53f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/2585cd.wgsl b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl
new file mode 100644
index 0000000..c5684bb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<4, 3, f32>) -> mat<3, 4, f32>
+fn transpose_2585cd() {
+  var res: mat3x4<f32> = transpose(mat4x3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_2585cd();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_2585cd();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_2585cd();
+}
diff --git a/test/tint/builtins/gen/transpose/2585cd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/2585cd.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/2585cd.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/2585cd.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/2585cd.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/2585cd.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/2585cd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/2585cd.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/2585cd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/2585cd.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/2585cd.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/31d679.wgsl b/test/tint/builtins/gen/literal/transpose/31d679.wgsl
new file mode 100644
index 0000000..389fd14
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/31d679.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<2, 2, f32>) -> mat<2, 2, f32>
+fn transpose_31d679() {
+  var res: mat2x2<f32> = transpose(mat2x2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_31d679();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_31d679();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_31d679();
+}
diff --git a/test/tint/builtins/gen/transpose/31d679.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31d679.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/31d679.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31d679.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/31d679.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31d679.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/31d679.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/31d679.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/31d679.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31d679.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/31d679.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/31e37e.wgsl b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl
new file mode 100644
index 0000000..bbce3e9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<4, 2, f32>) -> mat<2, 4, f32>
+fn transpose_31e37e() {
+  var res: mat2x4<f32> = transpose(mat4x2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_31e37e();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_31e37e();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_31e37e();
+}
diff --git a/test/tint/builtins/gen/transpose/31e37e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31e37e.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/31e37e.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31e37e.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/31e37e.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31e37e.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/31e37e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/31e37e.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/31e37e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/31e37e.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/31e37e.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/4ce359.wgsl b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl
new file mode 100644
index 0000000..40aa959
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<2, 4, f32>) -> mat<4, 2, f32>
+fn transpose_4ce359() {
+  var res: mat4x2<f32> = transpose(mat2x4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_4ce359();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_4ce359();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_4ce359();
+}
diff --git a/test/tint/builtins/gen/transpose/4ce359.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4ce359.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/4ce359.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4ce359.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/4ce359.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4ce359.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/4ce359.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/4ce359.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/4ce359.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4ce359.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/4ce359.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl
new file mode 100644
index 0000000..8ff6bb9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<2, 3, f32>) -> mat<3, 2, f32>
+fn transpose_4dc9a1() {
+  var res: mat3x2<f32> = transpose(mat2x3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_4dc9a1();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_4dc9a1();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_4dc9a1();
+}
diff --git a/test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/4dc9a1.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/4dc9a1.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/854336.wgsl b/test/tint/builtins/gen/literal/transpose/854336.wgsl
new file mode 100644
index 0000000..46949b2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/854336.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<3, 3, f32>) -> mat<3, 3, f32>
+fn transpose_854336() {
+  var res: mat3x3<f32> = transpose(mat3x3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_854336();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_854336();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_854336();
+}
diff --git a/test/tint/builtins/gen/transpose/854336.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/854336.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/854336.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/854336.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/854336.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/854336.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/854336.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/854336.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/854336.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/854336.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/854336.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/c1b600.wgsl b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl
new file mode 100644
index 0000000..4030074
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<4, 4, f32>) -> mat<4, 4, f32>
+fn transpose_c1b600() {
+  var res: mat4x4<f32> = transpose(mat4x4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_c1b600();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_c1b600();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_c1b600();
+}
diff --git a/test/tint/builtins/gen/transpose/c1b600.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/c1b600.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/c1b600.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/c1b600.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/c1b600.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/c1b600.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/c1b600.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/c1b600.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/c1b600.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/c1b600.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/c1b600.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl
new file mode 100644
index 0000000..8c75b91
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<3, 4, f32>) -> mat<4, 3, f32>
+fn transpose_d8f8ba() {
+  var res: mat4x3<f32> = transpose(mat3x4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_d8f8ba();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_d8f8ba();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_d8f8ba();
+}
diff --git a/test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/d8f8ba.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/d8f8ba.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl
new file mode 100644
index 0000000..7274022
--- /dev/null
+++ b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn transpose(mat<3, 2, f32>) -> mat<2, 3, f32>
+fn transpose_ed4bdc() {
+  var res: mat2x3<f32> = transpose(mat3x2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  transpose_ed4bdc();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  transpose_ed4bdc();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  transpose_ed4bdc();
+}
diff --git a/test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.msl b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/transpose/ed4bdc.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/transpose/ed4bdc.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/trunc/562d05.wgsl b/test/tint/builtins/gen/literal/trunc/562d05.wgsl
new file mode 100644
index 0000000..1ee6499
--- /dev/null
+++ b/test/tint/builtins/gen/literal/trunc/562d05.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn trunc(vec<3, f32>) -> vec<3, f32>
+fn trunc_562d05() {
+  var res: vec3<f32> = trunc(vec3<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  trunc_562d05();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  trunc_562d05();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  trunc_562d05();
+}
diff --git a/test/tint/builtins/gen/trunc/562d05.wgsl.expected.glsl b/test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/562d05.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/trunc/562d05.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/562d05.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/trunc/562d05.wgsl.expected.msl b/test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/trunc/562d05.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/trunc/562d05.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/trunc/562d05.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/trunc/562d05.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/562d05.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/trunc/562d05.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/trunc/e183aa.wgsl b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl
new file mode 100644
index 0000000..a29a53e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn trunc(vec<4, f32>) -> vec<4, f32>
+fn trunc_e183aa() {
+  var res: vec4<f32> = trunc(vec4<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  trunc_e183aa();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  trunc_e183aa();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  trunc_e183aa();
+}
diff --git a/test/tint/builtins/gen/trunc/e183aa.wgsl.expected.glsl b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/e183aa.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/trunc/e183aa.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/e183aa.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/trunc/e183aa.wgsl.expected.msl b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/trunc/e183aa.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/trunc/e183aa.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/trunc/e183aa.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/trunc/e183aa.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/e183aa.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/trunc/e183aa.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/trunc/eb83df.wgsl b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl
new file mode 100644
index 0000000..8297d29
--- /dev/null
+++ b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn trunc(f32) -> f32
+fn trunc_eb83df() {
+  var res: f32 = trunc(1.0);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  trunc_eb83df();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  trunc_eb83df();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  trunc_eb83df();
+}
diff --git a/test/tint/builtins/gen/trunc/eb83df.wgsl.expected.glsl b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/eb83df.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/trunc/eb83df.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/eb83df.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/trunc/eb83df.wgsl.expected.msl b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/trunc/eb83df.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/trunc/eb83df.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/trunc/eb83df.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/trunc/eb83df.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/eb83df.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/trunc/eb83df.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/trunc/f370d3.wgsl b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl
new file mode 100644
index 0000000..9521b39
--- /dev/null
+++ b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn trunc(vec<2, f32>) -> vec<2, f32>
+fn trunc_f370d3() {
+  var res: vec2<f32> = trunc(vec2<f32>());
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  trunc_f370d3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  trunc_f370d3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  trunc_f370d3();
+}
diff --git a/test/tint/builtins/gen/trunc/f370d3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/f370d3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/trunc/f370d3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/f370d3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/trunc/f370d3.wgsl.expected.msl b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/trunc/f370d3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/trunc/f370d3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/trunc/f370d3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/trunc/f370d3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/trunc/f370d3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/trunc/f370d3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl
new file mode 100644
index 0000000..dd78296
--- /dev/null
+++ b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn unpack2x16float(u32) -> vec2<f32>
+fn unpack2x16float_32a5cf() {
+  var res: vec2<f32> = unpack2x16float(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  unpack2x16float_32a5cf();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  unpack2x16float_32a5cf();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  unpack2x16float_32a5cf();
+}
diff --git a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.glsl b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.msl b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/unpack2x16float/32a5cf.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl
new file mode 100644
index 0000000..a832d27
--- /dev/null
+++ b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn unpack2x16snorm(u32) -> vec2<f32>
+fn unpack2x16snorm_b4aea6() {
+  var res: vec2<f32> = unpack2x16snorm(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  unpack2x16snorm_b4aea6();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  unpack2x16snorm_b4aea6();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  unpack2x16snorm_b4aea6();
+}
diff --git a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.msl b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/unpack2x16snorm/b4aea6.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl
new file mode 100644
index 0000000..73a124e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn unpack2x16unorm(u32) -> vec2<f32>
+fn unpack2x16unorm_7699c0() {
+  var res: vec2<f32> = unpack2x16unorm(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  unpack2x16unorm_7699c0();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  unpack2x16unorm_7699c0();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  unpack2x16unorm_7699c0();
+}
diff --git a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.msl b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/unpack2x16unorm/7699c0.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl
new file mode 100644
index 0000000..a6c458e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn unpack4x8snorm(u32) -> vec4<f32>
+fn unpack4x8snorm_523fb3() {
+  var res: vec4<f32> = unpack4x8snorm(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  unpack4x8snorm_523fb3();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  unpack4x8snorm_523fb3();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  unpack4x8snorm_523fb3();
+}
diff --git a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.msl b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/unpack4x8snorm/523fb3.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl
new file mode 100644
index 0000000..6b3c5e7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn unpack4x8unorm(u32) -> vec4<f32>
+fn unpack4x8unorm_750c74() {
+  var res: vec4<f32> = unpack4x8unorm(1u);
+}
+
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
+  unpack4x8unorm_750c74();
+  return vec4<f32>();
+}
+
+@stage(fragment)
+fn fragment_main() {
+  unpack4x8unorm_750c74();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  unpack4x8unorm_750c74();
+}
diff --git a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.glsl b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.msl b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/unpack4x8unorm/750c74.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl
new file mode 100644
index 0000000..3b3f327
--- /dev/null
+++ b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl
@@ -0,0 +1,34 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/tint/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn workgroupBarrier()
+fn workgroupBarrier_a17f7f() {
+  workgroupBarrier();
+}
+
+@stage(compute) @workgroup_size(1)
+fn compute_main() {
+  workgroupBarrier_a17f7f();
+}
diff --git a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.glsl
similarity index 100%
rename from test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.glsl
rename to test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.glsl
diff --git a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.hlsl b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.hlsl
similarity index 100%
rename from test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.hlsl
rename to test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.hlsl
diff --git a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.msl b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.msl
similarity index 100%
rename from test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.msl
rename to test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.msl
diff --git a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.spvasm
similarity index 100%
rename from test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.spvasm
rename to test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.spvasm
diff --git a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.wgsl
similarity index 100%
rename from test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl.expected.wgsl
rename to test/tint/builtins/gen/literal/workgroupBarrier/a17f7f.wgsl.expected.wgsl
diff --git a/test/tint/builtins/gen/log/3da25a.wgsl b/test/tint/builtins/gen/log/3da25a.wgsl
deleted file mode 100644
index c487a20..0000000
--- a/test/tint/builtins/gen/log/3da25a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log(vec<4, f32>) -> vec<4, f32>
-fn log_3da25a() {
-  var res: vec4<f32> = log(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log_3da25a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log_3da25a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log_3da25a();
-}
diff --git a/test/tint/builtins/gen/log/7114a6.wgsl b/test/tint/builtins/gen/log/7114a6.wgsl
deleted file mode 100644
index b3c4b74..0000000
--- a/test/tint/builtins/gen/log/7114a6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log(f32) -> f32
-fn log_7114a6() {
-  var res: f32 = log(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log_7114a6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log_7114a6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log_7114a6();
-}
diff --git a/test/tint/builtins/gen/log/b2ce28.wgsl b/test/tint/builtins/gen/log/b2ce28.wgsl
deleted file mode 100644
index 1a52cf4..0000000
--- a/test/tint/builtins/gen/log/b2ce28.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log(vec<2, f32>) -> vec<2, f32>
-fn log_b2ce28() {
-  var res: vec2<f32> = log(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log_b2ce28();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log_b2ce28();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log_b2ce28();
-}
diff --git a/test/tint/builtins/gen/log/f4c570.wgsl b/test/tint/builtins/gen/log/f4c570.wgsl
deleted file mode 100644
index f6a1a38..0000000
--- a/test/tint/builtins/gen/log/f4c570.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log(vec<3, f32>) -> vec<3, f32>
-fn log_f4c570() {
-  var res: vec3<f32> = log(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log_f4c570();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log_f4c570();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log_f4c570();
-}
diff --git a/test/tint/builtins/gen/log2/4036ed.wgsl b/test/tint/builtins/gen/log2/4036ed.wgsl
deleted file mode 100644
index bd4b0f3..0000000
--- a/test/tint/builtins/gen/log2/4036ed.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log2(f32) -> f32
-fn log2_4036ed() {
-  var res: f32 = log2(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log2_4036ed();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log2_4036ed();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log2_4036ed();
-}
diff --git a/test/tint/builtins/gen/log2/902988.wgsl b/test/tint/builtins/gen/log2/902988.wgsl
deleted file mode 100644
index 19328fe..0000000
--- a/test/tint/builtins/gen/log2/902988.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log2(vec<4, f32>) -> vec<4, f32>
-fn log2_902988() {
-  var res: vec4<f32> = log2(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log2_902988();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log2_902988();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log2_902988();
-}
diff --git a/test/tint/builtins/gen/log2/adb233.wgsl b/test/tint/builtins/gen/log2/adb233.wgsl
deleted file mode 100644
index dfd796f..0000000
--- a/test/tint/builtins/gen/log2/adb233.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log2(vec<3, f32>) -> vec<3, f32>
-fn log2_adb233() {
-  var res: vec3<f32> = log2(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log2_adb233();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log2_adb233();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log2_adb233();
-}
diff --git a/test/tint/builtins/gen/log2/aea659.wgsl b/test/tint/builtins/gen/log2/aea659.wgsl
deleted file mode 100644
index 1cc02c6..0000000
--- a/test/tint/builtins/gen/log2/aea659.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn log2(vec<2, f32>) -> vec<2, f32>
-fn log2_aea659() {
-  var res: vec2<f32> = log2(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  log2_aea659();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  log2_aea659();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  log2_aea659();
-}
diff --git a/test/tint/builtins/gen/max/0c0aae.wgsl b/test/tint/builtins/gen/max/0c0aae.wgsl
deleted file mode 100644
index 0df8611..0000000
--- a/test/tint/builtins/gen/max/0c0aae.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(u32, u32) -> u32
-fn max_0c0aae() {
-  var res: u32 = max(1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_0c0aae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_0c0aae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_0c0aae();
-}
diff --git a/test/tint/builtins/gen/max/25eafe.wgsl b/test/tint/builtins/gen/max/25eafe.wgsl
deleted file mode 100644
index b86d137..0000000
--- a/test/tint/builtins/gen/max/25eafe.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<3, i32>, vec<3, i32>) -> vec<3, i32>
-fn max_25eafe() {
-  var res: vec3<i32> = max(vec3<i32>(), vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_25eafe();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_25eafe();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_25eafe();
-}
diff --git a/test/tint/builtins/gen/max/320815.wgsl b/test/tint/builtins/gen/max/320815.wgsl
deleted file mode 100644
index c931f35..0000000
--- a/test/tint/builtins/gen/max/320815.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<2, u32>, vec<2, u32>) -> vec<2, u32>
-fn max_320815() {
-  var res: vec2<u32> = max(vec2<u32>(), vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_320815();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_320815();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_320815();
-}
diff --git a/test/tint/builtins/gen/max/44a39d.wgsl b/test/tint/builtins/gen/max/44a39d.wgsl
deleted file mode 100644
index 0215463..0000000
--- a/test/tint/builtins/gen/max/44a39d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(f32, f32) -> f32
-fn max_44a39d() {
-  var res: f32 = max(1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_44a39d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_44a39d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_44a39d();
-}
diff --git a/test/tint/builtins/gen/max/453e04.wgsl b/test/tint/builtins/gen/max/453e04.wgsl
deleted file mode 100644
index 9d55ca87..0000000
--- a/test/tint/builtins/gen/max/453e04.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<4, u32>, vec<4, u32>) -> vec<4, u32>
-fn max_453e04() {
-  var res: vec4<u32> = max(vec4<u32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_453e04();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_453e04();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_453e04();
-}
diff --git a/test/tint/builtins/gen/max/462050.wgsl b/test/tint/builtins/gen/max/462050.wgsl
deleted file mode 100644
index bbff876..0000000
--- a/test/tint/builtins/gen/max/462050.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn max_462050() {
-  var res: vec2<f32> = max(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_462050();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_462050();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_462050();
-}
diff --git a/test/tint/builtins/gen/max/4883ac.wgsl b/test/tint/builtins/gen/max/4883ac.wgsl
deleted file mode 100644
index 5656824..0000000
--- a/test/tint/builtins/gen/max/4883ac.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn max_4883ac() {
-  var res: vec3<f32> = max(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_4883ac();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_4883ac();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_4883ac();
-}
diff --git a/test/tint/builtins/gen/max/85e6bc.wgsl b/test/tint/builtins/gen/max/85e6bc.wgsl
deleted file mode 100644
index 478a405..0000000
--- a/test/tint/builtins/gen/max/85e6bc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<4, i32>, vec<4, i32>) -> vec<4, i32>
-fn max_85e6bc() {
-  var res: vec4<i32> = max(vec4<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_85e6bc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_85e6bc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_85e6bc();
-}
diff --git a/test/tint/builtins/gen/max/a93419.wgsl b/test/tint/builtins/gen/max/a93419.wgsl
deleted file mode 100644
index 1779143..0000000
--- a/test/tint/builtins/gen/max/a93419.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn max_a93419() {
-  var res: vec4<f32> = max(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_a93419();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_a93419();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_a93419();
-}
diff --git a/test/tint/builtins/gen/max/b1b73a.wgsl b/test/tint/builtins/gen/max/b1b73a.wgsl
deleted file mode 100644
index 07dd4a2..0000000
--- a/test/tint/builtins/gen/max/b1b73a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<3, u32>, vec<3, u32>) -> vec<3, u32>
-fn max_b1b73a() {
-  var res: vec3<u32> = max(vec3<u32>(), vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_b1b73a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_b1b73a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_b1b73a();
-}
diff --git a/test/tint/builtins/gen/max/ce7c30.wgsl b/test/tint/builtins/gen/max/ce7c30.wgsl
deleted file mode 100644
index c119aae..0000000
--- a/test/tint/builtins/gen/max/ce7c30.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(i32, i32) -> i32
-fn max_ce7c30() {
-  var res: i32 = max(1, 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_ce7c30();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_ce7c30();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_ce7c30();
-}
diff --git a/test/tint/builtins/gen/max/e8192f.wgsl b/test/tint/builtins/gen/max/e8192f.wgsl
deleted file mode 100644
index aa0ebb3..0000000
--- a/test/tint/builtins/gen/max/e8192f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn max(vec<2, i32>, vec<2, i32>) -> vec<2, i32>
-fn max_e8192f() {
-  var res: vec2<i32> = max(vec2<i32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  max_e8192f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  max_e8192f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  max_e8192f();
-}
diff --git a/test/tint/builtins/gen/min/03c7e3.wgsl b/test/tint/builtins/gen/min/03c7e3.wgsl
deleted file mode 100644
index e237394..0000000
--- a/test/tint/builtins/gen/min/03c7e3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<2, i32>, vec<2, i32>) -> vec<2, i32>
-fn min_03c7e3() {
-  var res: vec2<i32> = min(vec2<i32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_03c7e3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_03c7e3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_03c7e3();
-}
diff --git a/test/tint/builtins/gen/min/0dc614.wgsl b/test/tint/builtins/gen/min/0dc614.wgsl
deleted file mode 100644
index 8c896ee..0000000
--- a/test/tint/builtins/gen/min/0dc614.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<4, u32>, vec<4, u32>) -> vec<4, u32>
-fn min_0dc614() {
-  var res: vec4<u32> = min(vec4<u32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_0dc614();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_0dc614();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_0dc614();
-}
diff --git a/test/tint/builtins/gen/min/3941e1.wgsl b/test/tint/builtins/gen/min/3941e1.wgsl
deleted file mode 100644
index 350d70f..0000000
--- a/test/tint/builtins/gen/min/3941e1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<4, i32>, vec<4, i32>) -> vec<4, i32>
-fn min_3941e1() {
-  var res: vec4<i32> = min(vec4<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_3941e1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_3941e1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_3941e1();
-}
diff --git a/test/tint/builtins/gen/min/46c5d3.wgsl b/test/tint/builtins/gen/min/46c5d3.wgsl
deleted file mode 100644
index 9d6e701..0000000
--- a/test/tint/builtins/gen/min/46c5d3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(u32, u32) -> u32
-fn min_46c5d3() {
-  var res: u32 = min(1u, 1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_46c5d3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_46c5d3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_46c5d3();
-}
diff --git a/test/tint/builtins/gen/min/82b28f.wgsl b/test/tint/builtins/gen/min/82b28f.wgsl
deleted file mode 100644
index b6e12bc..0000000
--- a/test/tint/builtins/gen/min/82b28f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<2, u32>, vec<2, u32>) -> vec<2, u32>
-fn min_82b28f() {
-  var res: vec2<u32> = min(vec2<u32>(), vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_82b28f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_82b28f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_82b28f();
-}
diff --git a/test/tint/builtins/gen/min/93cfc4.wgsl b/test/tint/builtins/gen/min/93cfc4.wgsl
deleted file mode 100644
index bb98a54..0000000
--- a/test/tint/builtins/gen/min/93cfc4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn min_93cfc4() {
-  var res: vec3<f32> = min(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_93cfc4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_93cfc4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_93cfc4();
-}
diff --git a/test/tint/builtins/gen/min/a45171.wgsl b/test/tint/builtins/gen/min/a45171.wgsl
deleted file mode 100644
index 4504a1a..0000000
--- a/test/tint/builtins/gen/min/a45171.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<3, i32>, vec<3, i32>) -> vec<3, i32>
-fn min_a45171() {
-  var res: vec3<i32> = min(vec3<i32>(), vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_a45171();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_a45171();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_a45171();
-}
diff --git a/test/tint/builtins/gen/min/aa28ad.wgsl b/test/tint/builtins/gen/min/aa28ad.wgsl
deleted file mode 100644
index 741e3cb..0000000
--- a/test/tint/builtins/gen/min/aa28ad.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn min_aa28ad() {
-  var res: vec2<f32> = min(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_aa28ad();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_aa28ad();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_aa28ad();
-}
diff --git a/test/tint/builtins/gen/min/af326d.wgsl b/test/tint/builtins/gen/min/af326d.wgsl
deleted file mode 100644
index aa0b6da..0000000
--- a/test/tint/builtins/gen/min/af326d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(f32, f32) -> f32
-fn min_af326d() {
-  var res: f32 = min(1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_af326d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_af326d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_af326d();
-}
diff --git a/test/tint/builtins/gen/min/c70bb7.wgsl b/test/tint/builtins/gen/min/c70bb7.wgsl
deleted file mode 100644
index 3be9612..0000000
--- a/test/tint/builtins/gen/min/c70bb7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<3, u32>, vec<3, u32>) -> vec<3, u32>
-fn min_c70bb7() {
-  var res: vec3<u32> = min(vec3<u32>(), vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_c70bb7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_c70bb7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_c70bb7();
-}
diff --git a/test/tint/builtins/gen/min/c73147.wgsl b/test/tint/builtins/gen/min/c73147.wgsl
deleted file mode 100644
index 80b0a21..0000000
--- a/test/tint/builtins/gen/min/c73147.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(i32, i32) -> i32
-fn min_c73147() {
-  var res: i32 = min(1, 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_c73147();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_c73147();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_c73147();
-}
diff --git a/test/tint/builtins/gen/min/c76fa6.wgsl b/test/tint/builtins/gen/min/c76fa6.wgsl
deleted file mode 100644
index 1de3701..0000000
--- a/test/tint/builtins/gen/min/c76fa6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn min(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn min_c76fa6() {
-  var res: vec4<f32> = min(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  min_c76fa6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  min_c76fa6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  min_c76fa6();
-}
diff --git a/test/tint/builtins/gen/mix/0c8c33.wgsl b/test/tint/builtins/gen/mix/0c8c33.wgsl
deleted file mode 100644
index a78946c..0000000
--- a/test/tint/builtins/gen/mix/0c8c33.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn mix_0c8c33() {
-  var res: vec3<f32> = mix(vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_0c8c33();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_0c8c33();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_0c8c33();
-}
diff --git a/test/tint/builtins/gen/mix/1faeb1.wgsl b/test/tint/builtins/gen/mix/1faeb1.wgsl
deleted file mode 100644
index d453ef6..0000000
--- a/test/tint/builtins/gen/mix/1faeb1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(vec<4, f32>, vec<4, f32>, f32) -> vec<4, f32>
-fn mix_1faeb1() {
-  var res: vec4<f32> = mix(vec4<f32>(), vec4<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_1faeb1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_1faeb1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_1faeb1();
-}
diff --git a/test/tint/builtins/gen/mix/2fadab.wgsl b/test/tint/builtins/gen/mix/2fadab.wgsl
deleted file mode 100644
index a360975..0000000
--- a/test/tint/builtins/gen/mix/2fadab.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(vec<2, f32>, vec<2, f32>, f32) -> vec<2, f32>
-fn mix_2fadab() {
-  var res: vec2<f32> = mix(vec2<f32>(), vec2<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_2fadab();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_2fadab();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_2fadab();
-}
diff --git a/test/tint/builtins/gen/mix/315264.wgsl b/test/tint/builtins/gen/mix/315264.wgsl
deleted file mode 100644
index c70834f..0000000
--- a/test/tint/builtins/gen/mix/315264.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(vec<3, f32>, vec<3, f32>, f32) -> vec<3, f32>
-fn mix_315264() {
-  var res: vec3<f32> = mix(vec3<f32>(), vec3<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_315264();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_315264();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_315264();
-}
diff --git a/test/tint/builtins/gen/mix/4f0b5e.wgsl b/test/tint/builtins/gen/mix/4f0b5e.wgsl
deleted file mode 100644
index 0b07586..0000000
--- a/test/tint/builtins/gen/mix/4f0b5e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(f32, f32, f32) -> f32
-fn mix_4f0b5e() {
-  var res: f32 = mix(1.0, 1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_4f0b5e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_4f0b5e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_4f0b5e();
-}
diff --git a/test/tint/builtins/gen/mix/6f8adc.wgsl b/test/tint/builtins/gen/mix/6f8adc.wgsl
deleted file mode 100644
index ad177e2..0000000
--- a/test/tint/builtins/gen/mix/6f8adc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn mix_6f8adc() {
-  var res: vec2<f32> = mix(vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_6f8adc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_6f8adc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_6f8adc();
-}
diff --git a/test/tint/builtins/gen/mix/c37ede.wgsl b/test/tint/builtins/gen/mix/c37ede.wgsl
deleted file mode 100644
index d72f984..0000000
--- a/test/tint/builtins/gen/mix/c37ede.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn mix(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn mix_c37ede() {
-  var res: vec4<f32> = mix(vec4<f32>(), vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  mix_c37ede();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  mix_c37ede();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  mix_c37ede();
-}
diff --git a/test/tint/builtins/gen/modf/180fed.wgsl b/test/tint/builtins/gen/modf/180fed.wgsl
deleted file mode 100644
index 962e3f3..0000000
--- a/test/tint/builtins/gen/modf/180fed.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn modf(f32) -> __modf_result
-fn modf_180fed() {
-  var res = modf(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  modf_180fed();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  modf_180fed();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  modf_180fed();
-}
diff --git a/test/tint/builtins/gen/modf/9b75f7.wgsl b/test/tint/builtins/gen/modf/9b75f7.wgsl
deleted file mode 100644
index aff6139..0000000
--- a/test/tint/builtins/gen/modf/9b75f7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn modf(vec<3, f32>) -> __modf_result_vec<3>
-fn modf_9b75f7() {
-  var res = modf(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  modf_9b75f7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  modf_9b75f7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  modf_9b75f7();
-}
diff --git a/test/tint/builtins/gen/modf/ec2dbc.wgsl b/test/tint/builtins/gen/modf/ec2dbc.wgsl
deleted file mode 100644
index 3bf8cb7..0000000
--- a/test/tint/builtins/gen/modf/ec2dbc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn modf(vec<4, f32>) -> __modf_result_vec<4>
-fn modf_ec2dbc() {
-  var res = modf(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  modf_ec2dbc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  modf_ec2dbc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  modf_ec2dbc();
-}
diff --git a/test/tint/builtins/gen/modf/f5f20d.wgsl b/test/tint/builtins/gen/modf/f5f20d.wgsl
deleted file mode 100644
index c251d46..0000000
--- a/test/tint/builtins/gen/modf/f5f20d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn modf(vec<2, f32>) -> __modf_result_vec<2>
-fn modf_f5f20d() {
-  var res = modf(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  modf_f5f20d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  modf_f5f20d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  modf_f5f20d();
-}
diff --git a/test/tint/builtins/gen/normalize/64d8c0.wgsl b/test/tint/builtins/gen/normalize/64d8c0.wgsl
deleted file mode 100644
index 4843a9e..0000000
--- a/test/tint/builtins/gen/normalize/64d8c0.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn normalize(vec<3, f32>) -> vec<3, f32>
-fn normalize_64d8c0() {
-  var res: vec3<f32> = normalize(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  normalize_64d8c0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  normalize_64d8c0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  normalize_64d8c0();
-}
diff --git a/test/tint/builtins/gen/normalize/9a0aab.wgsl b/test/tint/builtins/gen/normalize/9a0aab.wgsl
deleted file mode 100644
index 4bb13a2..0000000
--- a/test/tint/builtins/gen/normalize/9a0aab.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn normalize(vec<4, f32>) -> vec<4, f32>
-fn normalize_9a0aab() {
-  var res: vec4<f32> = normalize(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  normalize_9a0aab();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  normalize_9a0aab();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  normalize_9a0aab();
-}
diff --git a/test/tint/builtins/gen/normalize/fc2ef1.wgsl b/test/tint/builtins/gen/normalize/fc2ef1.wgsl
deleted file mode 100644
index f56eb0e..0000000
--- a/test/tint/builtins/gen/normalize/fc2ef1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn normalize(vec<2, f32>) -> vec<2, f32>
-fn normalize_fc2ef1() {
-  var res: vec2<f32> = normalize(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  normalize_fc2ef1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  normalize_fc2ef1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  normalize_fc2ef1();
-}
diff --git a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl b/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl
deleted file mode 100644
index 978bf65..0000000
--- a/test/tint/builtins/gen/pack2x16float/0e97b3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pack2x16float(vec2<f32>) -> u32
-fn pack2x16float_0e97b3() {
-  var res: u32 = pack2x16float(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pack2x16float_0e97b3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pack2x16float_0e97b3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pack2x16float_0e97b3();
-}
diff --git a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl b/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl
deleted file mode 100644
index 24346b7..0000000
--- a/test/tint/builtins/gen/pack2x16snorm/6c169b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pack2x16snorm(vec2<f32>) -> u32
-fn pack2x16snorm_6c169b() {
-  var res: u32 = pack2x16snorm(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pack2x16snorm_6c169b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pack2x16snorm_6c169b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pack2x16snorm_6c169b();
-}
diff --git a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl b/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl
deleted file mode 100644
index 037c11b..0000000
--- a/test/tint/builtins/gen/pack2x16unorm/0f08e4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pack2x16unorm(vec2<f32>) -> u32
-fn pack2x16unorm_0f08e4() {
-  var res: u32 = pack2x16unorm(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pack2x16unorm_0f08e4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pack2x16unorm_0f08e4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pack2x16unorm_0f08e4();
-}
diff --git a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl b/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl
deleted file mode 100644
index 681af1d..0000000
--- a/test/tint/builtins/gen/pack4x8snorm/4d22e7.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pack4x8snorm(vec4<f32>) -> u32
-fn pack4x8snorm_4d22e7() {
-  var res: u32 = pack4x8snorm(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pack4x8snorm_4d22e7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pack4x8snorm_4d22e7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pack4x8snorm_4d22e7();
-}
diff --git a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl b/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl
deleted file mode 100644
index ae25428..0000000
--- a/test/tint/builtins/gen/pack4x8unorm/95c456.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pack4x8unorm(vec4<f32>) -> u32
-fn pack4x8unorm_95c456() {
-  var res: u32 = pack4x8unorm(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pack4x8unorm_95c456();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pack4x8unorm_95c456();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pack4x8unorm_95c456();
-}
diff --git a/test/tint/builtins/gen/pow/04a908.wgsl b/test/tint/builtins/gen/pow/04a908.wgsl
deleted file mode 100644
index b195279..0000000
--- a/test/tint/builtins/gen/pow/04a908.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pow(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn pow_04a908() {
-  var res: vec4<f32> = pow(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pow_04a908();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pow_04a908();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pow_04a908();
-}
diff --git a/test/tint/builtins/gen/pow/46e029.wgsl b/test/tint/builtins/gen/pow/46e029.wgsl
deleted file mode 100644
index fbe7612..0000000
--- a/test/tint/builtins/gen/pow/46e029.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pow(f32, f32) -> f32
-fn pow_46e029() {
-  var res: f32 = pow(1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pow_46e029();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pow_46e029();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pow_46e029();
-}
diff --git a/test/tint/builtins/gen/pow/4a46c9.wgsl b/test/tint/builtins/gen/pow/4a46c9.wgsl
deleted file mode 100644
index c8293df..0000000
--- a/test/tint/builtins/gen/pow/4a46c9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pow(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn pow_4a46c9() {
-  var res: vec3<f32> = pow(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pow_4a46c9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pow_4a46c9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pow_4a46c9();
-}
diff --git a/test/tint/builtins/gen/pow/e60ea5.wgsl b/test/tint/builtins/gen/pow/e60ea5.wgsl
deleted file mode 100644
index f718b1e..0000000
--- a/test/tint/builtins/gen/pow/e60ea5.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn pow(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn pow_e60ea5() {
-  var res: vec2<f32> = pow(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  pow_e60ea5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  pow_e60ea5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  pow_e60ea5();
-}
diff --git a/test/tint/builtins/gen/radians/09b7fc.wgsl b/test/tint/builtins/gen/radians/09b7fc.wgsl
deleted file mode 100644
index 96d745e..0000000
--- a/test/tint/builtins/gen/radians/09b7fc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn radians(vec<4, f32>) -> vec<4, f32>
-fn radians_09b7fc() {
-  var res: vec4<f32> = radians(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  radians_09b7fc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  radians_09b7fc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  radians_09b7fc();
-}
diff --git a/test/tint/builtins/gen/radians/61687a.wgsl b/test/tint/builtins/gen/radians/61687a.wgsl
deleted file mode 100644
index f5f8a32..0000000
--- a/test/tint/builtins/gen/radians/61687a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn radians(vec<2, f32>) -> vec<2, f32>
-fn radians_61687a() {
-  var res: vec2<f32> = radians(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  radians_61687a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  radians_61687a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  radians_61687a();
-}
diff --git a/test/tint/builtins/gen/radians/6b0ff2.wgsl b/test/tint/builtins/gen/radians/6b0ff2.wgsl
deleted file mode 100644
index 859ff69..0000000
--- a/test/tint/builtins/gen/radians/6b0ff2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn radians(f32) -> f32
-fn radians_6b0ff2() {
-  var res: f32 = radians(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  radians_6b0ff2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  radians_6b0ff2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  radians_6b0ff2();
-}
diff --git a/test/tint/builtins/gen/radians/f96258.wgsl b/test/tint/builtins/gen/radians/f96258.wgsl
deleted file mode 100644
index 0e86d0e..0000000
--- a/test/tint/builtins/gen/radians/f96258.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn radians(vec<3, f32>) -> vec<3, f32>
-fn radians_f96258() {
-  var res: vec3<f32> = radians(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  radians_f96258();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  radians_f96258();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  radians_f96258();
-}
diff --git a/test/tint/builtins/gen/reflect/05357e.wgsl b/test/tint/builtins/gen/reflect/05357e.wgsl
deleted file mode 100644
index ef94895..0000000
--- a/test/tint/builtins/gen/reflect/05357e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reflect(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn reflect_05357e() {
-  var res: vec4<f32> = reflect(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reflect_05357e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reflect_05357e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reflect_05357e();
-}
diff --git a/test/tint/builtins/gen/reflect/b61e10.wgsl b/test/tint/builtins/gen/reflect/b61e10.wgsl
deleted file mode 100644
index 47cd039..0000000
--- a/test/tint/builtins/gen/reflect/b61e10.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reflect(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn reflect_b61e10() {
-  var res: vec2<f32> = reflect(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reflect_b61e10();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reflect_b61e10();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reflect_b61e10();
-}
diff --git a/test/tint/builtins/gen/reflect/f47fdb.wgsl b/test/tint/builtins/gen/reflect/f47fdb.wgsl
deleted file mode 100644
index 5bbf74c..0000000
--- a/test/tint/builtins/gen/reflect/f47fdb.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reflect(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn reflect_f47fdb() {
-  var res: vec3<f32> = reflect(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reflect_f47fdb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reflect_f47fdb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reflect_f47fdb();
-}
diff --git a/test/tint/builtins/gen/refract/7e02e6.wgsl b/test/tint/builtins/gen/refract/7e02e6.wgsl
deleted file mode 100644
index 1a2e7e4..0000000
--- a/test/tint/builtins/gen/refract/7e02e6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn refract(vec<4, f32>, vec<4, f32>, f32) -> vec<4, f32>
-fn refract_7e02e6() {
-  var res: vec4<f32> = refract(vec4<f32>(), vec4<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  refract_7e02e6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  refract_7e02e6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  refract_7e02e6();
-}
diff --git a/test/tint/builtins/gen/refract/cbc1d2.wgsl b/test/tint/builtins/gen/refract/cbc1d2.wgsl
deleted file mode 100644
index f34e7cd..0000000
--- a/test/tint/builtins/gen/refract/cbc1d2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn refract(vec<3, f32>, vec<3, f32>, f32) -> vec<3, f32>
-fn refract_cbc1d2() {
-  var res: vec3<f32> = refract(vec3<f32>(), vec3<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  refract_cbc1d2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  refract_cbc1d2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  refract_cbc1d2();
-}
diff --git a/test/tint/builtins/gen/refract/cd905f.wgsl b/test/tint/builtins/gen/refract/cd905f.wgsl
deleted file mode 100644
index d533834..0000000
--- a/test/tint/builtins/gen/refract/cd905f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn refract(vec<2, f32>, vec<2, f32>, f32) -> vec<2, f32>
-fn refract_cd905f() {
-  var res: vec2<f32> = refract(vec2<f32>(), vec2<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  refract_cd905f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  refract_cd905f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  refract_cd905f();
-}
diff --git a/test/tint/builtins/gen/reverseBits/222177.wgsl b/test/tint/builtins/gen/reverseBits/222177.wgsl
deleted file mode 100644
index 1224dd9..0000000
--- a/test/tint/builtins/gen/reverseBits/222177.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(vec<2, i32>) -> vec<2, i32>
-fn reverseBits_222177() {
-  var res: vec2<i32> = reverseBits(vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_222177();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_222177();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_222177();
-}
diff --git a/test/tint/builtins/gen/reverseBits/35fea9.wgsl b/test/tint/builtins/gen/reverseBits/35fea9.wgsl
deleted file mode 100644
index f62e494..0000000
--- a/test/tint/builtins/gen/reverseBits/35fea9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(vec<4, u32>) -> vec<4, u32>
-fn reverseBits_35fea9() {
-  var res: vec4<u32> = reverseBits(vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_35fea9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_35fea9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_35fea9();
-}
diff --git a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl b/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl
deleted file mode 100644
index b48ae4d..0000000
--- a/test/tint/builtins/gen/reverseBits/4dbd6f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(vec<4, i32>) -> vec<4, i32>
-fn reverseBits_4dbd6f() {
-  var res: vec4<i32> = reverseBits(vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_4dbd6f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_4dbd6f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_4dbd6f();
-}
diff --git a/test/tint/builtins/gen/reverseBits/7c4269.wgsl b/test/tint/builtins/gen/reverseBits/7c4269.wgsl
deleted file mode 100644
index e0b5fe8..0000000
--- a/test/tint/builtins/gen/reverseBits/7c4269.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(i32) -> i32
-fn reverseBits_7c4269() {
-  var res: i32 = reverseBits(1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_7c4269();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_7c4269();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_7c4269();
-}
diff --git a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl b/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl
deleted file mode 100644
index 6a104db..0000000
--- a/test/tint/builtins/gen/reverseBits/a6ccd4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(vec<3, u32>) -> vec<3, u32>
-fn reverseBits_a6ccd4() {
-  var res: vec3<u32> = reverseBits(vec3<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_a6ccd4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_a6ccd4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_a6ccd4();
-}
diff --git a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl b/test/tint/builtins/gen/reverseBits/c21bc1.wgsl
deleted file mode 100644
index 62e66a1..0000000
--- a/test/tint/builtins/gen/reverseBits/c21bc1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(vec<3, i32>) -> vec<3, i32>
-fn reverseBits_c21bc1() {
-  var res: vec3<i32> = reverseBits(vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_c21bc1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_c21bc1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_c21bc1();
-}
diff --git a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl b/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl
deleted file mode 100644
index 9bed87a..0000000
--- a/test/tint/builtins/gen/reverseBits/e1f4c1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(vec<2, u32>) -> vec<2, u32>
-fn reverseBits_e1f4c1() {
-  var res: vec2<u32> = reverseBits(vec2<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_e1f4c1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_e1f4c1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_e1f4c1();
-}
diff --git a/test/tint/builtins/gen/reverseBits/e31adf.wgsl b/test/tint/builtins/gen/reverseBits/e31adf.wgsl
deleted file mode 100644
index 2a599eb..0000000
--- a/test/tint/builtins/gen/reverseBits/e31adf.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn reverseBits(u32) -> u32
-fn reverseBits_e31adf() {
-  var res: u32 = reverseBits(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  reverseBits_e31adf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  reverseBits_e31adf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  reverseBits_e31adf();
-}
diff --git a/test/tint/builtins/gen/round/106c0b.wgsl b/test/tint/builtins/gen/round/106c0b.wgsl
deleted file mode 100644
index ab45faa..0000000
--- a/test/tint/builtins/gen/round/106c0b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn round(vec<4, f32>) -> vec<4, f32>
-fn round_106c0b() {
-  var res: vec4<f32> = round(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  round_106c0b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  round_106c0b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  round_106c0b();
-}
diff --git a/test/tint/builtins/gen/round/1c7897.wgsl b/test/tint/builtins/gen/round/1c7897.wgsl
deleted file mode 100644
index cf93996..0000000
--- a/test/tint/builtins/gen/round/1c7897.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn round(vec<3, f32>) -> vec<3, f32>
-fn round_1c7897() {
-  var res: vec3<f32> = round(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  round_1c7897();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  round_1c7897();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  round_1c7897();
-}
diff --git a/test/tint/builtins/gen/round/52c84d.wgsl b/test/tint/builtins/gen/round/52c84d.wgsl
deleted file mode 100644
index 94dff00..0000000
--- a/test/tint/builtins/gen/round/52c84d.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn round(vec<2, f32>) -> vec<2, f32>
-fn round_52c84d() {
-  var res: vec2<f32> = round(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  round_52c84d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  round_52c84d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  round_52c84d();
-}
diff --git a/test/tint/builtins/gen/round/9edc38.wgsl b/test/tint/builtins/gen/round/9edc38.wgsl
deleted file mode 100644
index f0d7468..0000000
--- a/test/tint/builtins/gen/round/9edc38.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn round(f32) -> f32
-fn round_9edc38() {
-  var res: f32 = round(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  round_9edc38();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  round_9edc38();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  round_9edc38();
-}
diff --git a/test/tint/builtins/gen/select/00b848.wgsl b/test/tint/builtins/gen/select/00b848.wgsl
deleted file mode 100644
index cfe6e06..0000000
--- a/test/tint/builtins/gen/select/00b848.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, i32>, vec<2, i32>, vec<2, bool>) -> vec<2, i32>
-fn select_00b848() {
-  var res: vec2<i32> = select(vec2<i32>(), vec2<i32>(), vec2<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_00b848();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_00b848();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_00b848();
-}
diff --git a/test/tint/builtins/gen/select/01e2cd.wgsl b/test/tint/builtins/gen/select/01e2cd.wgsl
deleted file mode 100644
index 8e2a17b..0000000
--- a/test/tint/builtins/gen/select/01e2cd.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, i32>, vec<3, i32>, vec<3, bool>) -> vec<3, i32>
-fn select_01e2cd() {
-  var res: vec3<i32> = select(vec3<i32>(), vec3<i32>(), vec3<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_01e2cd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_01e2cd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_01e2cd();
-}
diff --git a/test/tint/builtins/gen/select/087ea4.wgsl b/test/tint/builtins/gen/select/087ea4.wgsl
deleted file mode 100644
index 17021a1..0000000
--- a/test/tint/builtins/gen/select/087ea4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, u32>, vec<4, u32>, bool) -> vec<4, u32>
-fn select_087ea4() {
-  var res: vec4<u32> = select(vec4<u32>(), vec4<u32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_087ea4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_087ea4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_087ea4();
-}
diff --git a/test/tint/builtins/gen/select/1e960b.wgsl b/test/tint/builtins/gen/select/1e960b.wgsl
deleted file mode 100644
index 7ccf111..0000000
--- a/test/tint/builtins/gen/select/1e960b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, u32>, vec<2, u32>, vec<2, bool>) -> vec<2, u32>
-fn select_1e960b() {
-  var res: vec2<u32> = select(vec2<u32>(), vec2<u32>(), vec2<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_1e960b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_1e960b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_1e960b();
-}
diff --git a/test/tint/builtins/gen/select/266aff.wgsl b/test/tint/builtins/gen/select/266aff.wgsl
deleted file mode 100644
index d475b4a..0000000
--- a/test/tint/builtins/gen/select/266aff.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, f32>, vec<2, f32>, vec<2, bool>) -> vec<2, f32>
-fn select_266aff() {
-  var res: vec2<f32> = select(vec2<f32>(), vec2<f32>(), vec2<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_266aff();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_266aff();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_266aff();
-}
diff --git a/test/tint/builtins/gen/select/28a27e.wgsl b/test/tint/builtins/gen/select/28a27e.wgsl
deleted file mode 100644
index 149379e..0000000
--- a/test/tint/builtins/gen/select/28a27e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, u32>, vec<3, u32>, vec<3, bool>) -> vec<3, u32>
-fn select_28a27e() {
-  var res: vec3<u32> = select(vec3<u32>(), vec3<u32>(), vec3<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_28a27e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_28a27e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_28a27e();
-}
diff --git a/test/tint/builtins/gen/select/3c25ce.wgsl b/test/tint/builtins/gen/select/3c25ce.wgsl
deleted file mode 100644
index a855d39..0000000
--- a/test/tint/builtins/gen/select/3c25ce.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, bool>, vec<3, bool>, bool) -> vec<3, bool>
-fn select_3c25ce() {
-  var res: vec3<bool> = select(vec3<bool>(), vec3<bool>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_3c25ce();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_3c25ce();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_3c25ce();
-}
diff --git a/test/tint/builtins/gen/select/416e14.wgsl b/test/tint/builtins/gen/select/416e14.wgsl
deleted file mode 100644
index b953b5a..0000000
--- a/test/tint/builtins/gen/select/416e14.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(f32, f32, bool) -> f32
-fn select_416e14() {
-  var res: f32 = select(1.0, 1.0, bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_416e14();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_416e14();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_416e14();
-}
diff --git a/test/tint/builtins/gen/select/51b047.wgsl b/test/tint/builtins/gen/select/51b047.wgsl
deleted file mode 100644
index 702cded..0000000
--- a/test/tint/builtins/gen/select/51b047.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, u32>, vec<2, u32>, bool) -> vec<2, u32>
-fn select_51b047() {
-  var res: vec2<u32> = select(vec2<u32>(), vec2<u32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_51b047();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_51b047();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_51b047();
-}
diff --git a/test/tint/builtins/gen/select/713567.wgsl b/test/tint/builtins/gen/select/713567.wgsl
deleted file mode 100644
index 3473d9f..0000000
--- a/test/tint/builtins/gen/select/713567.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, f32>, vec<4, f32>, bool) -> vec<4, f32>
-fn select_713567() {
-  var res: vec4<f32> = select(vec4<f32>(), vec4<f32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_713567();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_713567();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_713567();
-}
diff --git a/test/tint/builtins/gen/select/78be5f.wgsl b/test/tint/builtins/gen/select/78be5f.wgsl
deleted file mode 100644
index 3b95703..0000000
--- a/test/tint/builtins/gen/select/78be5f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, f32>, vec<3, f32>, bool) -> vec<3, f32>
-fn select_78be5f() {
-  var res: vec3<f32> = select(vec3<f32>(), vec3<f32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_78be5f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_78be5f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_78be5f();
-}
diff --git a/test/tint/builtins/gen/select/80a9a9.wgsl b/test/tint/builtins/gen/select/80a9a9.wgsl
deleted file mode 100644
index f24b7f6..0000000
--- a/test/tint/builtins/gen/select/80a9a9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, bool>, vec<3, bool>, vec<3, bool>) -> vec<3, bool>
-fn select_80a9a9() {
-  var res: vec3<bool> = select(vec3<bool>(), vec3<bool>(), vec3<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_80a9a9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_80a9a9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_80a9a9();
-}
diff --git a/test/tint/builtins/gen/select/8fa62c.wgsl b/test/tint/builtins/gen/select/8fa62c.wgsl
deleted file mode 100644
index c5f67f3..0000000
--- a/test/tint/builtins/gen/select/8fa62c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, i32>, vec<3, i32>, bool) -> vec<3, i32>
-fn select_8fa62c() {
-  var res: vec3<i32> = select(vec3<i32>(), vec3<i32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_8fa62c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_8fa62c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_8fa62c();
-}
diff --git a/test/tint/builtins/gen/select/99f883.wgsl b/test/tint/builtins/gen/select/99f883.wgsl
deleted file mode 100644
index a292314..0000000
--- a/test/tint/builtins/gen/select/99f883.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(u32, u32, bool) -> u32
-fn select_99f883() {
-  var res: u32 = select(1u, 1u, bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_99f883();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_99f883();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_99f883();
-}
diff --git a/test/tint/builtins/gen/select/a2860e.wgsl b/test/tint/builtins/gen/select/a2860e.wgsl
deleted file mode 100644
index 0f8a635..0000000
--- a/test/tint/builtins/gen/select/a2860e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, i32>, vec<4, i32>, vec<4, bool>) -> vec<4, i32>
-fn select_a2860e() {
-  var res: vec4<i32> = select(vec4<i32>(), vec4<i32>(), vec4<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_a2860e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_a2860e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_a2860e();
-}
diff --git a/test/tint/builtins/gen/select/ab069f.wgsl b/test/tint/builtins/gen/select/ab069f.wgsl
deleted file mode 100644
index d138d9e..0000000
--- a/test/tint/builtins/gen/select/ab069f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, i32>, vec<4, i32>, bool) -> vec<4, i32>
-fn select_ab069f() {
-  var res: vec4<i32> = select(vec4<i32>(), vec4<i32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_ab069f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_ab069f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_ab069f();
-}
diff --git a/test/tint/builtins/gen/select/b04721.wgsl b/test/tint/builtins/gen/select/b04721.wgsl
deleted file mode 100644
index 7f08456..0000000
--- a/test/tint/builtins/gen/select/b04721.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, u32>, vec<3, u32>, bool) -> vec<3, u32>
-fn select_b04721() {
-  var res: vec3<u32> = select(vec3<u32>(), vec3<u32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_b04721();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_b04721();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_b04721();
-}
diff --git a/test/tint/builtins/gen/select/bb447f.wgsl b/test/tint/builtins/gen/select/bb447f.wgsl
deleted file mode 100644
index 4ad509c..0000000
--- a/test/tint/builtins/gen/select/bb447f.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, i32>, vec<2, i32>, bool) -> vec<2, i32>
-fn select_bb447f() {
-  var res: vec2<i32> = select(vec2<i32>(), vec2<i32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_bb447f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_bb447f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_bb447f();
-}
diff --git a/test/tint/builtins/gen/select/bb8aae.wgsl b/test/tint/builtins/gen/select/bb8aae.wgsl
deleted file mode 100644
index f8ea555..0000000
--- a/test/tint/builtins/gen/select/bb8aae.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, f32>, vec<4, f32>, vec<4, bool>) -> vec<4, f32>
-fn select_bb8aae() {
-  var res: vec4<f32> = select(vec4<f32>(), vec4<f32>(), vec4<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_bb8aae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_bb8aae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_bb8aae();
-}
diff --git a/test/tint/builtins/gen/select/bf3d29.wgsl b/test/tint/builtins/gen/select/bf3d29.wgsl
deleted file mode 100644
index 411feeb1..0000000
--- a/test/tint/builtins/gen/select/bf3d29.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, f32>, vec<2, f32>, bool) -> vec<2, f32>
-fn select_bf3d29() {
-  var res: vec2<f32> = select(vec2<f32>(), vec2<f32>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_bf3d29();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_bf3d29();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_bf3d29();
-}
diff --git a/test/tint/builtins/gen/select/c31f9e.wgsl b/test/tint/builtins/gen/select/c31f9e.wgsl
deleted file mode 100644
index 90cd213..0000000
--- a/test/tint/builtins/gen/select/c31f9e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(bool, bool, bool) -> bool
-fn select_c31f9e() {
-  var res: bool = select(bool(), bool(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_c31f9e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_c31f9e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_c31f9e();
-}
diff --git a/test/tint/builtins/gen/select/c41bd1.wgsl b/test/tint/builtins/gen/select/c41bd1.wgsl
deleted file mode 100644
index fe6b19c..0000000
--- a/test/tint/builtins/gen/select/c41bd1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, bool>, vec<4, bool>, bool) -> vec<4, bool>
-fn select_c41bd1() {
-  var res: vec4<bool> = select(vec4<bool>(), vec4<bool>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_c41bd1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_c41bd1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_c41bd1();
-}
diff --git a/test/tint/builtins/gen/select/c4a4ef.wgsl b/test/tint/builtins/gen/select/c4a4ef.wgsl
deleted file mode 100644
index 36d6fe1..0000000
--- a/test/tint/builtins/gen/select/c4a4ef.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, u32>, vec<4, u32>, vec<4, bool>) -> vec<4, u32>
-fn select_c4a4ef() {
-  var res: vec4<u32> = select(vec4<u32>(), vec4<u32>(), vec4<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_c4a4ef();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_c4a4ef();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_c4a4ef();
-}
diff --git a/test/tint/builtins/gen/select/cb9301.wgsl b/test/tint/builtins/gen/select/cb9301.wgsl
deleted file mode 100644
index 90deaf2..0000000
--- a/test/tint/builtins/gen/select/cb9301.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, bool>, vec<2, bool>, vec<2, bool>) -> vec<2, bool>
-fn select_cb9301() {
-  var res: vec2<bool> = select(vec2<bool>(), vec2<bool>(), vec2<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_cb9301();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_cb9301();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_cb9301();
-}
diff --git a/test/tint/builtins/gen/select/e3e028.wgsl b/test/tint/builtins/gen/select/e3e028.wgsl
deleted file mode 100644
index d1fc18e..0000000
--- a/test/tint/builtins/gen/select/e3e028.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<4, bool>, vec<4, bool>, vec<4, bool>) -> vec<4, bool>
-fn select_e3e028() {
-  var res: vec4<bool> = select(vec4<bool>(), vec4<bool>(), vec4<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_e3e028();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_e3e028();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_e3e028();
-}
diff --git a/test/tint/builtins/gen/select/ebfea2.wgsl b/test/tint/builtins/gen/select/ebfea2.wgsl
deleted file mode 100644
index 24056f3..0000000
--- a/test/tint/builtins/gen/select/ebfea2.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<3, f32>, vec<3, f32>, vec<3, bool>) -> vec<3, f32>
-fn select_ebfea2() {
-  var res: vec3<f32> = select(vec3<f32>(), vec3<f32>(), vec3<bool>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_ebfea2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_ebfea2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_ebfea2();
-}
diff --git a/test/tint/builtins/gen/select/ed8a15.wgsl b/test/tint/builtins/gen/select/ed8a15.wgsl
deleted file mode 100644
index 10986bf..0000000
--- a/test/tint/builtins/gen/select/ed8a15.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(i32, i32, bool) -> i32
-fn select_ed8a15() {
-  var res: i32 = select(1, 1, bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_ed8a15();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_ed8a15();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_ed8a15();
-}
diff --git a/test/tint/builtins/gen/select/fb7e53.wgsl b/test/tint/builtins/gen/select/fb7e53.wgsl
deleted file mode 100644
index f81d8df..0000000
--- a/test/tint/builtins/gen/select/fb7e53.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn select(vec<2, bool>, vec<2, bool>, bool) -> vec<2, bool>
-fn select_fb7e53() {
-  var res: vec2<bool> = select(vec2<bool>(), vec2<bool>(), bool());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  select_fb7e53();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  select_fb7e53();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  select_fb7e53();
-}
diff --git a/test/tint/builtins/gen/sign/159665.wgsl b/test/tint/builtins/gen/sign/159665.wgsl
deleted file mode 100644
index 2cfae2e..0000000
--- a/test/tint/builtins/gen/sign/159665.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sign(vec<3, f32>) -> vec<3, f32>
-fn sign_159665() {
-  var res: vec3<f32> = sign(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sign_159665();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sign_159665();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sign_159665();
-}
diff --git a/test/tint/builtins/gen/sign/b8f634.wgsl b/test/tint/builtins/gen/sign/b8f634.wgsl
deleted file mode 100644
index 7b936e3..0000000
--- a/test/tint/builtins/gen/sign/b8f634.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sign(vec<4, f32>) -> vec<4, f32>
-fn sign_b8f634() {
-  var res: vec4<f32> = sign(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sign_b8f634();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sign_b8f634();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sign_b8f634();
-}
diff --git a/test/tint/builtins/gen/sign/d065d8.wgsl b/test/tint/builtins/gen/sign/d065d8.wgsl
deleted file mode 100644
index 1dadd5c..0000000
--- a/test/tint/builtins/gen/sign/d065d8.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sign(vec<2, f32>) -> vec<2, f32>
-fn sign_d065d8() {
-  var res: vec2<f32> = sign(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sign_d065d8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sign_d065d8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sign_d065d8();
-}
diff --git a/test/tint/builtins/gen/sign/dd790e.wgsl b/test/tint/builtins/gen/sign/dd790e.wgsl
deleted file mode 100644
index 0124aa8..0000000
--- a/test/tint/builtins/gen/sign/dd790e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sign(f32) -> f32
-fn sign_dd790e() {
-  var res: f32 = sign(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sign_dd790e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sign_dd790e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sign_dd790e();
-}
diff --git a/test/tint/builtins/gen/sin/01f241.wgsl b/test/tint/builtins/gen/sin/01f241.wgsl
deleted file mode 100644
index 951c1b9..0000000
--- a/test/tint/builtins/gen/sin/01f241.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sin(vec<3, f32>) -> vec<3, f32>
-fn sin_01f241() {
-  var res: vec3<f32> = sin(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sin_01f241();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sin_01f241();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sin_01f241();
-}
diff --git a/test/tint/builtins/gen/sin/4e3979.wgsl b/test/tint/builtins/gen/sin/4e3979.wgsl
deleted file mode 100644
index 5932c6f..0000000
--- a/test/tint/builtins/gen/sin/4e3979.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sin(vec<4, f32>) -> vec<4, f32>
-fn sin_4e3979() {
-  var res: vec4<f32> = sin(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sin_4e3979();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sin_4e3979();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sin_4e3979();
-}
diff --git a/test/tint/builtins/gen/sin/b78c91.wgsl b/test/tint/builtins/gen/sin/b78c91.wgsl
deleted file mode 100644
index 234b758..0000000
--- a/test/tint/builtins/gen/sin/b78c91.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sin(f32) -> f32
-fn sin_b78c91() {
-  var res: f32 = sin(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sin_b78c91();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sin_b78c91();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sin_b78c91();
-}
diff --git a/test/tint/builtins/gen/sin/fc8bc4.wgsl b/test/tint/builtins/gen/sin/fc8bc4.wgsl
deleted file mode 100644
index a035f8c..0000000
--- a/test/tint/builtins/gen/sin/fc8bc4.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sin(vec<2, f32>) -> vec<2, f32>
-fn sin_fc8bc4() {
-  var res: vec2<f32> = sin(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sin_fc8bc4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sin_fc8bc4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sin_fc8bc4();
-}
diff --git a/test/tint/builtins/gen/sinh/445e33.wgsl b/test/tint/builtins/gen/sinh/445e33.wgsl
deleted file mode 100644
index bd3aff2..0000000
--- a/test/tint/builtins/gen/sinh/445e33.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sinh(vec<4, f32>) -> vec<4, f32>
-fn sinh_445e33() {
-  var res: vec4<f32> = sinh(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sinh_445e33();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sinh_445e33();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sinh_445e33();
-}
diff --git a/test/tint/builtins/gen/sinh/7bb598.wgsl b/test/tint/builtins/gen/sinh/7bb598.wgsl
deleted file mode 100644
index df3be79..0000000
--- a/test/tint/builtins/gen/sinh/7bb598.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sinh(f32) -> f32
-fn sinh_7bb598() {
-  var res: f32 = sinh(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sinh_7bb598();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sinh_7bb598();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sinh_7bb598();
-}
diff --git a/test/tint/builtins/gen/sinh/b9860e.wgsl b/test/tint/builtins/gen/sinh/b9860e.wgsl
deleted file mode 100644
index 7f4fa1d..0000000
--- a/test/tint/builtins/gen/sinh/b9860e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sinh(vec<2, f32>) -> vec<2, f32>
-fn sinh_b9860e() {
-  var res: vec2<f32> = sinh(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sinh_b9860e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sinh_b9860e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sinh_b9860e();
-}
diff --git a/test/tint/builtins/gen/sinh/c9a5eb.wgsl b/test/tint/builtins/gen/sinh/c9a5eb.wgsl
deleted file mode 100644
index 699d4a8..0000000
--- a/test/tint/builtins/gen/sinh/c9a5eb.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sinh(vec<3, f32>) -> vec<3, f32>
-fn sinh_c9a5eb() {
-  var res: vec3<f32> = sinh(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sinh_c9a5eb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sinh_c9a5eb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sinh_c9a5eb();
-}
diff --git a/test/tint/builtins/gen/smoothstep/392c19.wgsl b/test/tint/builtins/gen/smoothstep/392c19.wgsl
deleted file mode 100644
index 018e920..0000000
--- a/test/tint/builtins/gen/smoothstep/392c19.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn smoothstep(vec<2, f32>, vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn smoothstep_392c19() {
-  var res: vec2<f32> = smoothstep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothstep_392c19();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothstep_392c19();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothstep_392c19();
-}
diff --git a/test/tint/builtins/gen/smoothstep/40864c.wgsl b/test/tint/builtins/gen/smoothstep/40864c.wgsl
deleted file mode 100644
index 403e8bf..0000000
--- a/test/tint/builtins/gen/smoothstep/40864c.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn smoothstep(vec<4, f32>, vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn smoothstep_40864c() {
-  var res: vec4<f32> = smoothstep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothstep_40864c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothstep_40864c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothstep_40864c();
-}
diff --git a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.glsl b/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.glsl
deleted file mode 100644
index 45ae81f..0000000
--- a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.glsl
+++ /dev/null
@@ -1,53 +0,0 @@
-builtins/gen/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-                       ^^^^^^^^^^
-
-#version 310 es
-
-void smoothStep_5f615b() {
-  vec4 res = smoothstep(vec4(0.0f), vec4(0.0f), vec4(0.0f));
-}
-
-vec4 vertex_main() {
-  smoothStep_5f615b();
-  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;
-
-void smoothStep_5f615b() {
-  vec4 res = smoothstep(vec4(0.0f), vec4(0.0f), vec4(0.0f));
-}
-
-void fragment_main() {
-  smoothStep_5f615b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-#version 310 es
-
-void smoothStep_5f615b() {
-  vec4 res = smoothstep(vec4(0.0f), vec4(0.0f), vec4(0.0f));
-}
-
-void compute_main() {
-  smoothStep_5f615b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.hlsl b/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.hlsl
deleted file mode 100644
index 256447d..0000000
--- a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-builtins/gen/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-                       ^^^^^^^^^^
-
-void smoothStep_5f615b() {
-  float4 res = smoothstep((0.0f).xxxx, (0.0f).xxxx, (0.0f).xxxx);
-}
-
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  smoothStep_5f615b();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  const float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-void fragment_main() {
-  smoothStep_5f615b();
-  return;
-}
-
-[numthreads(1, 1, 1)]
-void compute_main() {
-  smoothStep_5f615b();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.msl b/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.msl
deleted file mode 100644
index 3ba77c1..0000000
--- a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.msl
+++ /dev/null
@@ -1,37 +0,0 @@
-builtins/gen/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-                       ^^^^^^^^^^
-
-#include <metal_stdlib>
-
-using namespace metal;
-void smoothStep_5f615b() {
-  float4 res = smoothstep(float4(0.0f), float4(0.0f), float4(0.0f));
-}
-
-struct tint_symbol {
-  float4 value [[position]];
-};
-
-float4 vertex_main_inner() {
-  smoothStep_5f615b();
-  return float4(0.0f);
-}
-
-vertex tint_symbol vertex_main() {
-  float4 const inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-fragment void fragment_main() {
-  smoothStep_5f615b();
-  return;
-}
-
-kernel void compute_main() {
-  smoothStep_5f615b();
-  return;
-}
-
diff --git a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.spvasm b/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.spvasm
deleted file mode 100644
index 3e78282..0000000
--- a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.spvasm
+++ /dev/null
@@ -1,69 +0,0 @@
-builtins/gen/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-                       ^^^^^^^^^^
-
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 31
-; Schema: 0
-               OpCapability Shader
-         %14 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
-               OpEntryPoint Fragment %fragment_main "fragment_main"
-               OpEntryPoint GLCompute %compute_main "compute_main"
-               OpExecutionMode %fragment_main OriginUpperLeft
-               OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
-               OpName %vertex_point_size "vertex_point_size"
-               OpName %smoothStep_5f615b "smoothStep_5f615b"
-               OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
-               OpName %fragment_main "fragment_main"
-               OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
-               OpDecorate %vertex_point_size BuiltIn PointSize
-      %float = OpTypeFloat 32
-    %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-          %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-       %void = OpTypeVoid
-          %9 = OpTypeFunction %void
-%_ptr_Function_v4float = OpTypePointer Function %v4float
-         %17 = OpTypeFunction %v4float
-    %float_1 = OpConstant %float 1
-%smoothStep_5f615b = OpFunction %void None %9
-         %12 = OpLabel
-        %res = OpVariable %_ptr_Function_v4float Function %5
-         %13 = OpExtInst %v4float %14 SmoothStep %5 %5 %5
-               OpStore %res %13
-               OpReturn
-               OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %17
-         %19 = OpLabel
-         %20 = OpFunctionCall %void %smoothStep_5f615b
-               OpReturnValue %5
-               OpFunctionEnd
-%vertex_main = OpFunction %void None %9
-         %22 = OpLabel
-         %23 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %23
-               OpStore %vertex_point_size %float_1
-               OpReturn
-               OpFunctionEnd
-%fragment_main = OpFunction %void None %9
-         %26 = OpLabel
-         %27 = OpFunctionCall %void %smoothStep_5f615b
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %9
-         %29 = OpLabel
-         %30 = OpFunctionCall %void %smoothStep_5f615b
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.wgsl b/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.wgsl
deleted file mode 100644
index 89cc7bf..0000000
--- a/test/tint/builtins/gen/smoothstep/5f615b.wgsl.expected.wgsl
+++ /dev/null
@@ -1,23 +0,0 @@
-builtins/gen/smoothstep/5f615b.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-                       ^^^^^^^^^^
-
-fn smoothStep_5f615b() {
-  var res : vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothStep_5f615b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothStep_5f615b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothStep_5f615b();
-}
diff --git a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.glsl b/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.glsl
deleted file mode 100644
index 662c574..0000000
--- a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.glsl
+++ /dev/null
@@ -1,53 +0,0 @@
-builtins/gen/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-                       ^^^^^^^^^^
-
-#version 310 es
-
-void smoothStep_658be3() {
-  vec3 res = smoothstep(vec3(0.0f), vec3(0.0f), vec3(0.0f));
-}
-
-vec4 vertex_main() {
-  smoothStep_658be3();
-  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;
-
-void smoothStep_658be3() {
-  vec3 res = smoothstep(vec3(0.0f), vec3(0.0f), vec3(0.0f));
-}
-
-void fragment_main() {
-  smoothStep_658be3();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-#version 310 es
-
-void smoothStep_658be3() {
-  vec3 res = smoothstep(vec3(0.0f), vec3(0.0f), vec3(0.0f));
-}
-
-void compute_main() {
-  smoothStep_658be3();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.hlsl b/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.hlsl
deleted file mode 100644
index 0cc1cb4..0000000
--- a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-builtins/gen/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-                       ^^^^^^^^^^
-
-void smoothStep_658be3() {
-  float3 res = smoothstep((0.0f).xxx, (0.0f).xxx, (0.0f).xxx);
-}
-
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  smoothStep_658be3();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  const float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-void fragment_main() {
-  smoothStep_658be3();
-  return;
-}
-
-[numthreads(1, 1, 1)]
-void compute_main() {
-  smoothStep_658be3();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.msl b/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.msl
deleted file mode 100644
index 0cbf36b..0000000
--- a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.msl
+++ /dev/null
@@ -1,37 +0,0 @@
-builtins/gen/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-                       ^^^^^^^^^^
-
-#include <metal_stdlib>
-
-using namespace metal;
-void smoothStep_658be3() {
-  float3 res = smoothstep(float3(0.0f), float3(0.0f), float3(0.0f));
-}
-
-struct tint_symbol {
-  float4 value [[position]];
-};
-
-float4 vertex_main_inner() {
-  smoothStep_658be3();
-  return float4(0.0f);
-}
-
-vertex tint_symbol vertex_main() {
-  float4 const inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-fragment void fragment_main() {
-  smoothStep_658be3();
-  return;
-}
-
-kernel void compute_main() {
-  smoothStep_658be3();
-  return;
-}
-
diff --git a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.spvasm b/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.spvasm
deleted file mode 100644
index 032e30d..0000000
--- a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.spvasm
+++ /dev/null
@@ -1,71 +0,0 @@
-builtins/gen/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-                       ^^^^^^^^^^
-
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 33
-; Schema: 0
-               OpCapability Shader
-         %15 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
-               OpEntryPoint Fragment %fragment_main "fragment_main"
-               OpEntryPoint GLCompute %compute_main "compute_main"
-               OpExecutionMode %fragment_main OriginUpperLeft
-               OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
-               OpName %vertex_point_size "vertex_point_size"
-               OpName %smoothStep_658be3 "smoothStep_658be3"
-               OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
-               OpName %fragment_main "fragment_main"
-               OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
-               OpDecorate %vertex_point_size BuiltIn PointSize
-      %float = OpTypeFloat 32
-    %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-          %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-       %void = OpTypeVoid
-          %9 = OpTypeFunction %void
-    %v3float = OpTypeVector %float 3
-         %16 = OpConstantNull %v3float
-%_ptr_Function_v3float = OpTypePointer Function %v3float
-         %19 = OpTypeFunction %v4float
-    %float_1 = OpConstant %float 1
-%smoothStep_658be3 = OpFunction %void None %9
-         %12 = OpLabel
-        %res = OpVariable %_ptr_Function_v3float Function %16
-         %13 = OpExtInst %v3float %15 SmoothStep %16 %16 %16
-               OpStore %res %13
-               OpReturn
-               OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %19
-         %21 = OpLabel
-         %22 = OpFunctionCall %void %smoothStep_658be3
-               OpReturnValue %5
-               OpFunctionEnd
-%vertex_main = OpFunction %void None %9
-         %24 = OpLabel
-         %25 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %25
-               OpStore %vertex_point_size %float_1
-               OpReturn
-               OpFunctionEnd
-%fragment_main = OpFunction %void None %9
-         %28 = OpLabel
-         %29 = OpFunctionCall %void %smoothStep_658be3
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %9
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %smoothStep_658be3
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.wgsl b/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.wgsl
deleted file mode 100644
index 7e3aa5c..0000000
--- a/test/tint/builtins/gen/smoothstep/658be3.wgsl.expected.wgsl
+++ /dev/null
@@ -1,23 +0,0 @@
-builtins/gen/smoothstep/658be3.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-                       ^^^^^^^^^^
-
-fn smoothStep_658be3() {
-  var res : vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothStep_658be3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothStep_658be3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothStep_658be3();
-}
diff --git a/test/tint/builtins/gen/smoothstep/6c4975.wgsl b/test/tint/builtins/gen/smoothstep/6c4975.wgsl
deleted file mode 100644
index aa22a45..0000000
--- a/test/tint/builtins/gen/smoothstep/6c4975.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn smoothstep(f32, f32, f32) -> f32
-fn smoothstep_6c4975() {
-  var res: f32 = smoothstep(1.0, 1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothstep_6c4975();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothstep_6c4975();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothstep_6c4975();
-}
diff --git a/test/tint/builtins/gen/smoothstep/aad1db.wgsl b/test/tint/builtins/gen/smoothstep/aad1db.wgsl
deleted file mode 100644
index a3960d6..0000000
--- a/test/tint/builtins/gen/smoothstep/aad1db.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn smoothstep(vec<3, f32>, vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn smoothstep_aad1db() {
-  var res: vec3<f32> = smoothstep(vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothstep_aad1db();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothstep_aad1db();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothstep_aad1db();
-}
diff --git a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.glsl b/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.glsl
deleted file mode 100644
index f81ae7f..0000000
--- a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.glsl
+++ /dev/null
@@ -1,53 +0,0 @@
-builtins/gen/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-                       ^^^^^^^^^^
-
-#version 310 es
-
-void smoothStep_c11eef() {
-  vec2 res = smoothstep(vec2(0.0f), vec2(0.0f), vec2(0.0f));
-}
-
-vec4 vertex_main() {
-  smoothStep_c11eef();
-  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;
-
-void smoothStep_c11eef() {
-  vec2 res = smoothstep(vec2(0.0f), vec2(0.0f), vec2(0.0f));
-}
-
-void fragment_main() {
-  smoothStep_c11eef();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-#version 310 es
-
-void smoothStep_c11eef() {
-  vec2 res = smoothstep(vec2(0.0f), vec2(0.0f), vec2(0.0f));
-}
-
-void compute_main() {
-  smoothStep_c11eef();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.hlsl b/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.hlsl
deleted file mode 100644
index 15fe54d..0000000
--- a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-builtins/gen/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-                       ^^^^^^^^^^
-
-void smoothStep_c11eef() {
-  float2 res = smoothstep((0.0f).xx, (0.0f).xx, (0.0f).xx);
-}
-
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  smoothStep_c11eef();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  const float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-void fragment_main() {
-  smoothStep_c11eef();
-  return;
-}
-
-[numthreads(1, 1, 1)]
-void compute_main() {
-  smoothStep_c11eef();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.msl b/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.msl
deleted file mode 100644
index ed1317d..0000000
--- a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.msl
+++ /dev/null
@@ -1,37 +0,0 @@
-builtins/gen/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-                       ^^^^^^^^^^
-
-#include <metal_stdlib>
-
-using namespace metal;
-void smoothStep_c11eef() {
-  float2 res = smoothstep(float2(0.0f), float2(0.0f), float2(0.0f));
-}
-
-struct tint_symbol {
-  float4 value [[position]];
-};
-
-float4 vertex_main_inner() {
-  smoothStep_c11eef();
-  return float4(0.0f);
-}
-
-vertex tint_symbol vertex_main() {
-  float4 const inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-fragment void fragment_main() {
-  smoothStep_c11eef();
-  return;
-}
-
-kernel void compute_main() {
-  smoothStep_c11eef();
-  return;
-}
-
diff --git a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.spvasm b/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.spvasm
deleted file mode 100644
index 3bdb215..0000000
--- a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.spvasm
+++ /dev/null
@@ -1,71 +0,0 @@
-builtins/gen/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-                       ^^^^^^^^^^
-
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 33
-; Schema: 0
-               OpCapability Shader
-         %15 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
-               OpEntryPoint Fragment %fragment_main "fragment_main"
-               OpEntryPoint GLCompute %compute_main "compute_main"
-               OpExecutionMode %fragment_main OriginUpperLeft
-               OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
-               OpName %vertex_point_size "vertex_point_size"
-               OpName %smoothStep_c11eef "smoothStep_c11eef"
-               OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
-               OpName %fragment_main "fragment_main"
-               OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
-               OpDecorate %vertex_point_size BuiltIn PointSize
-      %float = OpTypeFloat 32
-    %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-          %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-       %void = OpTypeVoid
-          %9 = OpTypeFunction %void
-    %v2float = OpTypeVector %float 2
-         %16 = OpConstantNull %v2float
-%_ptr_Function_v2float = OpTypePointer Function %v2float
-         %19 = OpTypeFunction %v4float
-    %float_1 = OpConstant %float 1
-%smoothStep_c11eef = OpFunction %void None %9
-         %12 = OpLabel
-        %res = OpVariable %_ptr_Function_v2float Function %16
-         %13 = OpExtInst %v2float %15 SmoothStep %16 %16 %16
-               OpStore %res %13
-               OpReturn
-               OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %19
-         %21 = OpLabel
-         %22 = OpFunctionCall %void %smoothStep_c11eef
-               OpReturnValue %5
-               OpFunctionEnd
-%vertex_main = OpFunction %void None %9
-         %24 = OpLabel
-         %25 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %25
-               OpStore %vertex_point_size %float_1
-               OpReturn
-               OpFunctionEnd
-%fragment_main = OpFunction %void None %9
-         %28 = OpLabel
-         %29 = OpFunctionCall %void %smoothStep_c11eef
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %9
-         %31 = OpLabel
-         %32 = OpFunctionCall %void %smoothStep_c11eef
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.wgsl b/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.wgsl
deleted file mode 100644
index c390acb..0000000
--- a/test/tint/builtins/gen/smoothstep/c11eef.wgsl.expected.wgsl
+++ /dev/null
@@ -1,23 +0,0 @@
-builtins/gen/smoothstep/c11eef.wgsl:28:24 warning: use of deprecated builtin
-  var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-                       ^^^^^^^^^^
-
-fn smoothStep_c11eef() {
-  var res : vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothStep_c11eef();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothStep_c11eef();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothStep_c11eef();
-}
diff --git a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.glsl b/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.glsl
deleted file mode 100644
index 05627a1..0000000
--- a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.glsl
+++ /dev/null
@@ -1,53 +0,0 @@
-builtins/gen/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
-  var res: f32 = smoothStep(1.0, 1.0, 1.0);
-                 ^^^^^^^^^^
-
-#version 310 es
-
-void smoothStep_cb0bfb() {
-  float res = smoothstep(1.0f, 1.0f, 1.0f);
-}
-
-vec4 vertex_main() {
-  smoothStep_cb0bfb();
-  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;
-
-void smoothStep_cb0bfb() {
-  float res = smoothstep(1.0f, 1.0f, 1.0f);
-}
-
-void fragment_main() {
-  smoothStep_cb0bfb();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-#version 310 es
-
-void smoothStep_cb0bfb() {
-  float res = smoothstep(1.0f, 1.0f, 1.0f);
-}
-
-void compute_main() {
-  smoothStep_cb0bfb();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.hlsl b/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.hlsl
deleted file mode 100644
index 96f8e7d..0000000
--- a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-builtins/gen/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
-  var res: f32 = smoothStep(1.0, 1.0, 1.0);
-                 ^^^^^^^^^^
-
-void smoothStep_cb0bfb() {
-  float res = smoothstep(1.0f, 1.0f, 1.0f);
-}
-
-struct tint_symbol {
-  float4 value : SV_Position;
-};
-
-float4 vertex_main_inner() {
-  smoothStep_cb0bfb();
-  return (0.0f).xxxx;
-}
-
-tint_symbol vertex_main() {
-  const float4 inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = (tint_symbol)0;
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-void fragment_main() {
-  smoothStep_cb0bfb();
-  return;
-}
-
-[numthreads(1, 1, 1)]
-void compute_main() {
-  smoothStep_cb0bfb();
-  return;
-}
diff --git a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.msl b/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.msl
deleted file mode 100644
index 4f835bc..0000000
--- a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.msl
+++ /dev/null
@@ -1,37 +0,0 @@
-builtins/gen/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
-  var res: f32 = smoothStep(1.0, 1.0, 1.0);
-                 ^^^^^^^^^^
-
-#include <metal_stdlib>
-
-using namespace metal;
-void smoothStep_cb0bfb() {
-  float res = smoothstep(1.0f, 1.0f, 1.0f);
-}
-
-struct tint_symbol {
-  float4 value [[position]];
-};
-
-float4 vertex_main_inner() {
-  smoothStep_cb0bfb();
-  return float4(0.0f);
-}
-
-vertex tint_symbol vertex_main() {
-  float4 const inner_result = vertex_main_inner();
-  tint_symbol wrapper_result = {};
-  wrapper_result.value = inner_result;
-  return wrapper_result;
-}
-
-fragment void fragment_main() {
-  smoothStep_cb0bfb();
-  return;
-}
-
-kernel void compute_main() {
-  smoothStep_cb0bfb();
-  return;
-}
-
diff --git a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.spvasm b/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.spvasm
deleted file mode 100644
index 6286bc5..0000000
--- a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.spvasm
+++ /dev/null
@@ -1,69 +0,0 @@
-builtins/gen/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
-  var res: f32 = smoothStep(1.0, 1.0, 1.0);
-                 ^^^^^^^^^^
-
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 31
-; Schema: 0
-               OpCapability Shader
-         %14 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
-               OpEntryPoint Fragment %fragment_main "fragment_main"
-               OpEntryPoint GLCompute %compute_main "compute_main"
-               OpExecutionMode %fragment_main OriginUpperLeft
-               OpExecutionMode %compute_main LocalSize 1 1 1
-               OpName %value "value"
-               OpName %vertex_point_size "vertex_point_size"
-               OpName %smoothStep_cb0bfb "smoothStep_cb0bfb"
-               OpName %res "res"
-               OpName %vertex_main_inner "vertex_main_inner"
-               OpName %vertex_main "vertex_main"
-               OpName %fragment_main "fragment_main"
-               OpName %compute_main "compute_main"
-               OpDecorate %value BuiltIn Position
-               OpDecorate %vertex_point_size BuiltIn PointSize
-      %float = OpTypeFloat 32
-    %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-          %5 = OpConstantNull %v4float
-      %value = OpVariable %_ptr_Output_v4float Output %5
-%_ptr_Output_float = OpTypePointer Output %float
-          %8 = OpConstantNull %float
-%vertex_point_size = OpVariable %_ptr_Output_float Output %8
-       %void = OpTypeVoid
-          %9 = OpTypeFunction %void
-    %float_1 = OpConstant %float 1
-%_ptr_Function_float = OpTypePointer Function %float
-         %18 = OpTypeFunction %v4float
-%smoothStep_cb0bfb = OpFunction %void None %9
-         %12 = OpLabel
-        %res = OpVariable %_ptr_Function_float Function %8
-         %13 = OpExtInst %float %14 SmoothStep %float_1 %float_1 %float_1
-               OpStore %res %13
-               OpReturn
-               OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %18
-         %20 = OpLabel
-         %21 = OpFunctionCall %void %smoothStep_cb0bfb
-               OpReturnValue %5
-               OpFunctionEnd
-%vertex_main = OpFunction %void None %9
-         %23 = OpLabel
-         %24 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %24
-               OpStore %vertex_point_size %float_1
-               OpReturn
-               OpFunctionEnd
-%fragment_main = OpFunction %void None %9
-         %26 = OpLabel
-         %27 = OpFunctionCall %void %smoothStep_cb0bfb
-               OpReturn
-               OpFunctionEnd
-%compute_main = OpFunction %void None %9
-         %29 = OpLabel
-         %30 = OpFunctionCall %void %smoothStep_cb0bfb
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.wgsl b/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.wgsl
deleted file mode 100644
index d75d5f3..0000000
--- a/test/tint/builtins/gen/smoothstep/cb0bfb.wgsl.expected.wgsl
+++ /dev/null
@@ -1,23 +0,0 @@
-builtins/gen/smoothstep/cb0bfb.wgsl:28:18 warning: use of deprecated builtin
-  var res: f32 = smoothStep(1.0, 1.0, 1.0);
-                 ^^^^^^^^^^
-
-fn smoothStep_cb0bfb() {
-  var res : f32 = smoothStep(1.0, 1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  smoothStep_cb0bfb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  smoothStep_cb0bfb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  smoothStep_cb0bfb();
-}
diff --git a/test/tint/builtins/gen/sqrt/20c74e.wgsl b/test/tint/builtins/gen/sqrt/20c74e.wgsl
deleted file mode 100644
index 50d9717..0000000
--- a/test/tint/builtins/gen/sqrt/20c74e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sqrt(f32) -> f32
-fn sqrt_20c74e() {
-  var res: f32 = sqrt(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sqrt_20c74e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sqrt_20c74e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sqrt_20c74e();
-}
diff --git a/test/tint/builtins/gen/sqrt/8c7024.wgsl b/test/tint/builtins/gen/sqrt/8c7024.wgsl
deleted file mode 100644
index d2d31e7..0000000
--- a/test/tint/builtins/gen/sqrt/8c7024.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sqrt(vec<2, f32>) -> vec<2, f32>
-fn sqrt_8c7024() {
-  var res: vec2<f32> = sqrt(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sqrt_8c7024();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sqrt_8c7024();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sqrt_8c7024();
-}
diff --git a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl b/test/tint/builtins/gen/sqrt/aa0d7a.wgsl
deleted file mode 100644
index 5cbb2c3..0000000
--- a/test/tint/builtins/gen/sqrt/aa0d7a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sqrt(vec<4, f32>) -> vec<4, f32>
-fn sqrt_aa0d7a() {
-  var res: vec4<f32> = sqrt(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sqrt_aa0d7a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sqrt_aa0d7a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sqrt_aa0d7a();
-}
diff --git a/test/tint/builtins/gen/sqrt/f8c59a.wgsl b/test/tint/builtins/gen/sqrt/f8c59a.wgsl
deleted file mode 100644
index 82edecb..0000000
--- a/test/tint/builtins/gen/sqrt/f8c59a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn sqrt(vec<3, f32>) -> vec<3, f32>
-fn sqrt_f8c59a() {
-  var res: vec3<f32> = sqrt(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  sqrt_f8c59a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  sqrt_f8c59a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  sqrt_f8c59a();
-}
diff --git a/test/tint/builtins/gen/step/0b073b.wgsl b/test/tint/builtins/gen/step/0b073b.wgsl
deleted file mode 100644
index e90d956..0000000
--- a/test/tint/builtins/gen/step/0b073b.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn step(f32, f32) -> f32
-fn step_0b073b() {
-  var res: f32 = step(1.0, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  step_0b073b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  step_0b073b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  step_0b073b();
-}
diff --git a/test/tint/builtins/gen/step/19accd.wgsl b/test/tint/builtins/gen/step/19accd.wgsl
deleted file mode 100644
index 9f54581..0000000
--- a/test/tint/builtins/gen/step/19accd.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn step(vec<2, f32>, vec<2, f32>) -> vec<2, f32>
-fn step_19accd() {
-  var res: vec2<f32> = step(vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  step_19accd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  step_19accd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  step_19accd();
-}
diff --git a/test/tint/builtins/gen/step/334303.wgsl b/test/tint/builtins/gen/step/334303.wgsl
deleted file mode 100644
index 922ffb1..0000000
--- a/test/tint/builtins/gen/step/334303.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn step(vec<3, f32>, vec<3, f32>) -> vec<3, f32>
-fn step_334303() {
-  var res: vec3<f32> = step(vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  step_334303();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  step_334303();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  step_334303();
-}
diff --git a/test/tint/builtins/gen/step/e2b337.wgsl b/test/tint/builtins/gen/step/e2b337.wgsl
deleted file mode 100644
index 218fde5..0000000
--- a/test/tint/builtins/gen/step/e2b337.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn step(vec<4, f32>, vec<4, f32>) -> vec<4, f32>
-fn step_e2b337() {
-  var res: vec4<f32> = step(vec4<f32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  step_e2b337();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  step_e2b337();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  step_e2b337();
-}
diff --git a/test/tint/builtins/gen/storageBarrier/d87211.wgsl b/test/tint/builtins/gen/storageBarrier/d87211.wgsl
deleted file mode 100644
index b98fa8c..0000000
--- a/test/tint/builtins/gen/storageBarrier/d87211.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn storageBarrier()
-fn storageBarrier_d87211() {
-  storageBarrier();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  storageBarrier_d87211();
-}
diff --git a/test/tint/builtins/gen/tan/244e2a.wgsl b/test/tint/builtins/gen/tan/244e2a.wgsl
deleted file mode 100644
index 2d61b0e..0000000
--- a/test/tint/builtins/gen/tan/244e2a.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tan(vec<4, f32>) -> vec<4, f32>
-fn tan_244e2a() {
-  var res: vec4<f32> = tan(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tan_244e2a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tan_244e2a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tan_244e2a();
-}
diff --git a/test/tint/builtins/gen/tan/2f030e.wgsl b/test/tint/builtins/gen/tan/2f030e.wgsl
deleted file mode 100644
index b5b038a..0000000
--- a/test/tint/builtins/gen/tan/2f030e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tan(f32) -> f32
-fn tan_2f030e() {
-  var res: f32 = tan(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tan_2f030e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tan_2f030e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tan_2f030e();
-}
diff --git a/test/tint/builtins/gen/tan/7ea104.wgsl b/test/tint/builtins/gen/tan/7ea104.wgsl
deleted file mode 100644
index 1a25547..0000000
--- a/test/tint/builtins/gen/tan/7ea104.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tan(vec<3, f32>) -> vec<3, f32>
-fn tan_7ea104() {
-  var res: vec3<f32> = tan(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tan_7ea104();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tan_7ea104();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tan_7ea104();
-}
diff --git a/test/tint/builtins/gen/tan/8ce3e9.wgsl b/test/tint/builtins/gen/tan/8ce3e9.wgsl
deleted file mode 100644
index ec2ff09..0000000
--- a/test/tint/builtins/gen/tan/8ce3e9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tan(vec<2, f32>) -> vec<2, f32>
-fn tan_8ce3e9() {
-  var res: vec2<f32> = tan(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tan_8ce3e9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tan_8ce3e9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tan_8ce3e9();
-}
diff --git a/test/tint/builtins/gen/tanh/5663c5.wgsl b/test/tint/builtins/gen/tanh/5663c5.wgsl
deleted file mode 100644
index d8b3708..0000000
--- a/test/tint/builtins/gen/tanh/5663c5.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tanh(vec<4, f32>) -> vec<4, f32>
-fn tanh_5663c5() {
-  var res: vec4<f32> = tanh(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tanh_5663c5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tanh_5663c5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tanh_5663c5();
-}
diff --git a/test/tint/builtins/gen/tanh/5724b3.wgsl b/test/tint/builtins/gen/tanh/5724b3.wgsl
deleted file mode 100644
index 0a184d2..0000000
--- a/test/tint/builtins/gen/tanh/5724b3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tanh(vec<2, f32>) -> vec<2, f32>
-fn tanh_5724b3() {
-  var res: vec2<f32> = tanh(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tanh_5724b3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tanh_5724b3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tanh_5724b3();
-}
diff --git a/test/tint/builtins/gen/tanh/9f9fb9.wgsl b/test/tint/builtins/gen/tanh/9f9fb9.wgsl
deleted file mode 100644
index 861bf41..0000000
--- a/test/tint/builtins/gen/tanh/9f9fb9.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tanh(vec<3, f32>) -> vec<3, f32>
-fn tanh_9f9fb9() {
-  var res: vec3<f32> = tanh(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tanh_9f9fb9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tanh_9f9fb9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tanh_9f9fb9();
-}
diff --git a/test/tint/builtins/gen/tanh/c15fdb.wgsl b/test/tint/builtins/gen/tanh/c15fdb.wgsl
deleted file mode 100644
index 35b0597..0000000
--- a/test/tint/builtins/gen/tanh/c15fdb.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn tanh(f32) -> f32
-fn tanh_c15fdb() {
-  var res: f32 = tanh(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  tanh_c15fdb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  tanh_c15fdb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  tanh_c15fdb();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl b/test/tint/builtins/gen/textureDimensions/002b2a.wgsl
deleted file mode 100644
index 3edc18b..0000000
--- a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<f32>;
-
-// fn textureDimensions(texture: texture_1d<f32>) -> i32
-fn textureDimensions_002b2a() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_002b2a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_002b2a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_002b2a();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.glsl
deleted file mode 100644
index d2663c5..0000000
--- a/test/tint/builtins/gen/textureDimensions/002b2a.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureDimensions_002b2a() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_002b2a();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler1D arg_0_1;
-void textureDimensions_002b2a() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void fragment_main() {
-  textureDimensions_002b2a();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'sampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureDimensions_002b2a() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void compute_main() {
-  textureDimensions_002b2a();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/012b82.wgsl b/test/tint/builtins/gen/textureDimensions/012b82.wgsl
deleted file mode 100644
index af04cf4..0000000
--- a/test/tint/builtins/gen/textureDimensions/012b82.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<r32sint, write>) -> vec2<i32>
-fn textureDimensions_012b82() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_012b82();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_012b82();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_012b82();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/08753d.wgsl b/test/tint/builtins/gen/textureDimensions/08753d.wgsl
deleted file mode 100644
index e012e2c..0000000
--- a/test/tint/builtins/gen/textureDimensions/08753d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba16sint, write>) -> i32
-fn textureDimensions_08753d() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_08753d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_08753d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_08753d();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.glsl
deleted file mode 100644
index 9f92f84..0000000
--- a/test/tint/builtins/gen/textureDimensions/08753d.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_08753d() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_08753d();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba16i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_08753d() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_08753d();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_08753d() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_08753d();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl b/test/tint/builtins/gen/textureDimensions/0c4772.wgsl
deleted file mode 100644
index 42af723..0000000
--- a/test/tint/builtins/gen/textureDimensions/0c4772.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba16float, write>) -> vec3<i32>
-fn textureDimensions_0c4772() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0c4772();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_0c4772();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_0c4772();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl b/test/tint/builtins/gen/textureDimensions/0cce40.wgsl
deleted file mode 100644
index cb527a9..0000000
--- a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<r32sint, write>) -> i32
-fn textureDimensions_0cce40() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0cce40();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_0cce40();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_0cce40();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.glsl
deleted file mode 100644
index 3e1b29f..0000000
--- a/test/tint/builtins/gen/textureDimensions/0cce40.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(r32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_0cce40() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_0cce40();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(r32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_0cce40() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_0cce40();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(r32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_0cce40() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_0cce40();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl b/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl
deleted file mode 100644
index 738123f..0000000
--- a/test/tint/builtins/gen/textureDimensions/0cf2ff.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba16uint, write>) -> vec2<i32>
-fn textureDimensions_0cf2ff() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0cf2ff();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_0cf2ff();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_0cf2ff();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl b/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl
deleted file mode 100644
index 19b92f6..0000000
--- a/test/tint/builtins/gen/textureDimensions/0d8b7e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<r32uint, write>) -> vec2<i32>
-fn textureDimensions_0d8b7e() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0d8b7e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_0d8b7e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_0d8b7e();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl b/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl
deleted file mode 100644
index 8a36816..0000000
--- a/test/tint/builtins/gen/textureDimensions/0e32ee.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba16uint, write>) -> vec3<i32>
-fn textureDimensions_0e32ee() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0e32ee();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_0e32ee();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_0e32ee();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl b/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl
deleted file mode 100644
index 17a8ef1..0000000
--- a/test/tint/builtins/gen/textureDimensions/0f3c50.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
-
-// fn textureDimensions(texture: texture_2d_array<i32>) -> vec2<i32>
-fn textureDimensions_0f3c50() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_0f3c50();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_0f3c50();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_0f3c50();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl b/test/tint/builtins/gen/textureDimensions/1191a5.wgsl
deleted file mode 100644
index ad3dab8..0000000
--- a/test/tint/builtins/gen/textureDimensions/1191a5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<u32>;
-
-// fn textureDimensions(texture: texture_2d<u32>) -> vec2<i32>
-fn textureDimensions_1191a5() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1191a5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_1191a5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_1191a5();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl b/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl
deleted file mode 100644
index f292f6d..0000000
--- a/test/tint/builtins/gen/textureDimensions/12c9bb.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-
-// fn textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
-fn textureDimensions_12c9bb() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_12c9bb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_12c9bb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_12c9bb();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/147998.wgsl b/test/tint/builtins/gen/textureDimensions/147998.wgsl
deleted file mode 100644
index 5acc4c1..0000000
--- a/test/tint/builtins/gen/textureDimensions/147998.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rg32float, write>) -> vec2<i32>
-fn textureDimensions_147998() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_147998();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_147998();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_147998();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.glsl
deleted file mode 100644
index 077635f..0000000
--- a/test/tint/builtins/gen/textureDimensions/147998.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2D arg_0;
-void textureDimensions_147998() {
-  ivec2 res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_147998();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image2D arg_0;
-void textureDimensions_147998() {
-  ivec2 res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_147998();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2D arg_0;
-void textureDimensions_147998() {
-  ivec2 res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_147998();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/16036c.wgsl b/test/tint/builtins/gen/textureDimensions/16036c.wgsl
deleted file mode 100644
index dbaa1de..0000000
--- a/test/tint/builtins/gen/textureDimensions/16036c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba8sint, write>) -> vec2<i32>
-fn textureDimensions_16036c() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_16036c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_16036c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_16036c();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl b/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl
deleted file mode 100644
index daa3954..0000000
--- a/test/tint/builtins/gen/textureDimensions/1b71f0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba16sint, write>) -> vec3<i32>
-fn textureDimensions_1b71f0() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1b71f0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_1b71f0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_1b71f0();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl b/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl
deleted file mode 100644
index 428f5ed..0000000
--- a/test/tint/builtins/gen/textureDimensions/1d6c26.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba8unorm, write>) -> vec2<i32>
-fn textureDimensions_1d6c26() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1d6c26();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_1d6c26();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_1d6c26();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl b/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl
deleted file mode 100644
index 17be4e0..0000000
--- a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba16float, write>) -> i32
-fn textureDimensions_1e9e39() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1e9e39();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_1e9e39();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_1e9e39();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.glsl
deleted file mode 100644
index 8a9a8c8..0000000
--- a/test/tint/builtins/gen/textureDimensions/1e9e39.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba16f) uniform highp writeonly image1D arg_0;
-void textureDimensions_1e9e39() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_1e9e39();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba16f) uniform highp writeonly image1D arg_0;
-void textureDimensions_1e9e39() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_1e9e39();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba16f) uniform highp writeonly image1D arg_0;
-void textureDimensions_1e9e39() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_1e9e39();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl b/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl
deleted file mode 100644
index 6598efb..0000000
--- a/test/tint/builtins/gen/textureDimensions/1f20c5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
-
-// fn textureDimensions(texture: texture_2d_array<u32>) -> vec2<i32>
-fn textureDimensions_1f20c5() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_1f20c5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_1f20c5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_1f20c5();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl b/test/tint/builtins/gen/textureDimensions/214dd4.wgsl
deleted file mode 100644
index b462c70..0000000
--- a/test/tint/builtins/gen/textureDimensions/214dd4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba8sint, write>) -> vec3<i32>
-fn textureDimensions_214dd4() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_214dd4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_214dd4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_214dd4();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/221f22.wgsl b/test/tint/builtins/gen/textureDimensions/221f22.wgsl
deleted file mode 100644
index 8b3835a..0000000
--- a/test/tint/builtins/gen/textureDimensions/221f22.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
-
-// fn textureDimensions(texture: texture_cube_array<i32>, level: i32) -> vec2<i32>
-fn textureDimensions_221f22() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_221f22();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_221f22();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_221f22();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.glsl
deleted file mode 100644
index a66bf2c..0000000
--- a/test/tint/builtins/gen/textureDimensions/221f22.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureDimensions_221f22() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_221f22();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureDimensions_221f22() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_221f22();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureDimensions_221f22() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_221f22();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/267788.wgsl b/test/tint/builtins/gen/textureDimensions/267788.wgsl
deleted file mode 100644
index a90cd81..0000000
--- a/test/tint/builtins/gen/textureDimensions/267788.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
-
-// fn textureDimensions(texture: texture_2d_array<u32>, level: i32) -> vec2<i32>
-fn textureDimensions_267788() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_267788();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_267788();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_267788();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl b/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl
deleted file mode 100644
index 6f4278b..0000000
--- a/test/tint/builtins/gen/textureDimensions/26bdfa.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-
-// fn textureDimensions(texture: texture_3d<f32>, level: i32) -> vec3<i32>
-fn textureDimensions_26bdfa() {
-  var res: vec3<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_26bdfa();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_26bdfa();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_26bdfa();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl b/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl
deleted file mode 100644
index 45a5004..0000000
--- a/test/tint/builtins/gen/textureDimensions/26ef6c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba8uint, write>) -> vec2<i32>
-fn textureDimensions_26ef6c() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_26ef6c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_26ef6c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_26ef6c();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl b/test/tint/builtins/gen/textureDimensions/2ad087.wgsl
deleted file mode 100644
index b26368d..0000000
--- a/test/tint/builtins/gen/textureDimensions/2ad087.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba16sint, write>) -> vec2<i32>
-fn textureDimensions_2ad087() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2ad087();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_2ad087();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_2ad087();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl b/test/tint/builtins/gen/textureDimensions/2efa05.wgsl
deleted file mode 100644
index 8989190..0000000
--- a/test/tint/builtins/gen/textureDimensions/2efa05.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<u32>;
-
-// fn textureDimensions(texture: texture_3d<u32>, level: i32) -> vec3<i32>
-fn textureDimensions_2efa05() {
-  var res: vec3<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2efa05();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_2efa05();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_2efa05();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl b/test/tint/builtins/gen/textureDimensions/2f289f.wgsl
deleted file mode 100644
index bb5a07f..0000000
--- a/test/tint/builtins/gen/textureDimensions/2f289f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<r32sint, write>) -> vec3<i32>
-fn textureDimensions_2f289f() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2f289f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_2f289f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_2f289f();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl b/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl
deleted file mode 100644
index 4b3ebb5..0000000
--- a/test/tint/builtins/gen/textureDimensions/2fe1cc.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-
-// fn textureDimensions(texture: texture_2d<f32>, level: i32) -> vec2<i32>
-fn textureDimensions_2fe1cc() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_2fe1cc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_2fe1cc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_2fe1cc();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl b/test/tint/builtins/gen/textureDimensions/318ecc.wgsl
deleted file mode 100644
index 88f0459..0000000
--- a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba16uint, write>) -> i32
-fn textureDimensions_318ecc() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_318ecc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_318ecc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_318ecc();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.glsl
deleted file mode 100644
index 1e789b9..0000000
--- a/test/tint/builtins/gen/textureDimensions/318ecc.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_318ecc() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_318ecc();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_318ecc() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_318ecc();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_318ecc() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_318ecc();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/340d06.wgsl b/test/tint/builtins/gen/textureDimensions/340d06.wgsl
deleted file mode 100644
index aa5d78e..0000000
--- a/test/tint/builtins/gen/textureDimensions/340d06.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<r32uint, write>) -> vec3<i32>
-fn textureDimensions_340d06() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_340d06();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_340d06();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_340d06();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/398e30.wgsl b/test/tint/builtins/gen/textureDimensions/398e30.wgsl
deleted file mode 100644
index ba00534..0000000
--- a/test/tint/builtins/gen/textureDimensions/398e30.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba32uint, write>) -> vec2<i32>
-fn textureDimensions_398e30() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_398e30();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_398e30();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_398e30();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl b/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl
deleted file mode 100644
index b008333..0000000
--- a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rg32uint, write>) -> vec2<i32>
-fn textureDimensions_3a94ea() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3a94ea();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_3a94ea();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_3a94ea();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.glsl
deleted file mode 100644
index 8ea82bf..0000000
--- a/test/tint/builtins/gen/textureDimensions/3a94ea.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2D arg_0;
-void textureDimensions_3a94ea() {
-  ivec2 res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_3a94ea();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage2D arg_0;
-void textureDimensions_3a94ea() {
-  ivec2 res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_3a94ea();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2D arg_0;
-void textureDimensions_3a94ea() {
-  ivec2 res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_3a94ea();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl b/test/tint/builtins/gen/textureDimensions/3aca08.wgsl
deleted file mode 100644
index de36f08..0000000
--- a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba32float, write>) -> i32
-fn textureDimensions_3aca08() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3aca08();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_3aca08();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_3aca08();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.glsl
deleted file mode 100644
index eb335ea..0000000
--- a/test/tint/builtins/gen/textureDimensions/3aca08.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_3aca08() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_3aca08();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_3aca08() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_3aca08();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_3aca08() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_3aca08();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl b/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl
deleted file mode 100644
index 63398de..0000000
--- a/test/tint/builtins/gen/textureDimensions/3c5ad8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba8sint, write>) -> vec2<i32>
-fn textureDimensions_3c5ad8() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_3c5ad8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_3c5ad8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_3c5ad8();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl b/test/tint/builtins/gen/textureDimensions/4152a6.wgsl
deleted file mode 100644
index a8ee80c..0000000
--- a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
-
-// fn textureDimensions(texture: texture_cube_array<u32>) -> vec2<i32>
-fn textureDimensions_4152a6() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4152a6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_4152a6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_4152a6();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.glsl
deleted file mode 100644
index 8517e62..0000000
--- a/test/tint/builtins/gen/textureDimensions/4152a6.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureDimensions_4152a6() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_4152a6();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureDimensions_4152a6() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_4152a6();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureDimensions_4152a6() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_4152a6();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/423f99.wgsl b/test/tint/builtins/gen/textureDimensions/423f99.wgsl
deleted file mode 100644
index 8029171..0000000
--- a/test/tint/builtins/gen/textureDimensions/423f99.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<i32>;
-
-// fn textureDimensions(texture: texture_1d<i32>) -> i32
-fn textureDimensions_423f99() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_423f99();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_423f99();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_423f99();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.glsl
deleted file mode 100644
index 7602271..0000000
--- a/test/tint/builtins/gen/textureDimensions/423f99.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureDimensions_423f99() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_423f99();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler1D arg_0_1;
-void textureDimensions_423f99() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void fragment_main() {
-  textureDimensions_423f99();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureDimensions_423f99() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void compute_main() {
-  textureDimensions_423f99();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl b/test/tint/builtins/gen/textureDimensions/4267ee.wgsl
deleted file mode 100644
index 1596f1c..0000000
--- a/test/tint/builtins/gen/textureDimensions/4267ee.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba32float, write>) -> vec2<i32>
-fn textureDimensions_4267ee() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4267ee();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_4267ee();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_4267ee();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl b/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl
deleted file mode 100644
index 06b887a..0000000
--- a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba8unorm, write>) -> i32
-fn textureDimensions_42d4e6() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_42d4e6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_42d4e6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_42d4e6();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.glsl
deleted file mode 100644
index a7bb3d2..0000000
--- a/test/tint/builtins/gen/textureDimensions/42d4e6.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8) uniform highp writeonly image1D arg_0;
-void textureDimensions_42d4e6() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_42d4e6();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8) uniform highp writeonly image1D arg_0;
-void textureDimensions_42d4e6() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_42d4e6();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8) uniform highp writeonly image1D arg_0;
-void textureDimensions_42d4e6() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_42d4e6();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl b/test/tint/builtins/gen/textureDimensions/48cb89.wgsl
deleted file mode 100644
index 25deb1bb..0000000
--- a/test/tint/builtins/gen/textureDimensions/48cb89.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba16float, write>) -> vec2<i32>
-fn textureDimensions_48cb89() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_48cb89();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_48cb89();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_48cb89();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/49d274.wgsl b/test/tint/builtins/gen/textureDimensions/49d274.wgsl
deleted file mode 100644
index 37783cf..0000000
--- a/test/tint/builtins/gen/textureDimensions/49d274.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rg32sint, write>) -> vec2<i32>
-fn textureDimensions_49d274() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_49d274();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_49d274();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_49d274();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.glsl
deleted file mode 100644
index e441a61..0000000
--- a/test/tint/builtins/gen/textureDimensions/49d274.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureDimensions_49d274() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_49d274();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureDimensions_49d274() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_49d274();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureDimensions_49d274() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-void compute_main() {
-  textureDimensions_49d274();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl b/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl
deleted file mode 100644
index c5ea5dd..0000000
--- a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rg32uint, write>) -> i32
-fn textureDimensions_4df9a8() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_4df9a8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_4df9a8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_4df9a8();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.glsl
deleted file mode 100644
index 7eed976..0000000
--- a/test/tint/builtins/gen/textureDimensions/4df9a8.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_4df9a8() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_4df9a8();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_4df9a8() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_4df9a8();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_4df9a8() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_4df9a8();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl b/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl
deleted file mode 100644
index eefaaf8..0000000
--- a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-
-// fn textureDimensions(texture: texture_cube_array<f32>, level: i32) -> vec2<i32>
-fn textureDimensions_50a9ee() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_50a9ee();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_50a9ee();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_50a9ee();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.glsl
deleted file mode 100644
index c74de1b..0000000
--- a/test/tint/builtins/gen/textureDimensions/50a9ee.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_50a9ee() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_50a9ee();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_50a9ee() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_50a9ee();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_50a9ee() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_50a9ee();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/52045c.wgsl b/test/tint/builtins/gen/textureDimensions/52045c.wgsl
deleted file mode 100644
index e31d6be3..0000000
--- a/test/tint/builtins/gen/textureDimensions/52045c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<i32>;
-
-// fn textureDimensions(texture: texture_1d<i32>, level: i32) -> i32
-fn textureDimensions_52045c() {
-  var res: i32 = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_52045c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_52045c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_52045c();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.glsl
deleted file mode 100644
index 29cd75f..0000000
--- a/test/tint/builtins/gen/textureDimensions/52045c.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureDimensions_52045c() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_52045c();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler1D arg_0_1;
-void textureDimensions_52045c() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void fragment_main() {
-  textureDimensions_52045c();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureDimensions_52045c() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void compute_main() {
-  textureDimensions_52045c();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl b/test/tint/builtins/gen/textureDimensions/55b23e.wgsl
deleted file mode 100644
index 82cc566..0000000
--- a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rg32float, write>) -> i32
-fn textureDimensions_55b23e() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_55b23e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_55b23e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_55b23e();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.glsl
deleted file mode 100644
index 5941a90..0000000
--- a/test/tint/builtins/gen/textureDimensions/55b23e.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_55b23e() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_55b23e();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_55b23e() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_55b23e();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_55b23e() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_55b23e();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/579629.wgsl b/test/tint/builtins/gen/textureDimensions/579629.wgsl
deleted file mode 100644
index 49e35e3..0000000
--- a/test/tint/builtins/gen/textureDimensions/579629.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
-
-// fn textureDimensions(texture: texture_multisampled_2d<u32>) -> vec2<i32>
-fn textureDimensions_579629() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_579629();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_579629();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_579629();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl b/test/tint/builtins/gen/textureDimensions/57da0b.wgsl
deleted file mode 100644
index bf57595..0000000
--- a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<r32uint, write>) -> i32
-fn textureDimensions_57da0b() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_57da0b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_57da0b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_57da0b();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.glsl
deleted file mode 100644
index b9922a5..0000000
--- a/test/tint/builtins/gen/textureDimensions/57da0b.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(r32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_57da0b() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_57da0b();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(r32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_57da0b() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_57da0b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(r32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_57da0b() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_57da0b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl b/test/tint/builtins/gen/textureDimensions/57e28f.wgsl
deleted file mode 100644
index d782714..0000000
--- a/test/tint/builtins/gen/textureDimensions/57e28f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-
-// fn textureDimensions(texture: texture_depth_cube) -> vec2<i32>
-fn textureDimensions_57e28f() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_57e28f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_57e28f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_57e28f();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/58a515.wgsl b/test/tint/builtins/gen/textureDimensions/58a515.wgsl
deleted file mode 100644
index 1f024d4..0000000
--- a/test/tint/builtins/gen/textureDimensions/58a515.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba16float, write>) -> vec2<i32>
-fn textureDimensions_58a515() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_58a515();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_58a515();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_58a515();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl b/test/tint/builtins/gen/textureDimensions/5985f3.wgsl
deleted file mode 100644
index ba79f20..0000000
--- a/test/tint/builtins/gen/textureDimensions/5985f3.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba32sint, write>) -> vec2<i32>
-fn textureDimensions_5985f3() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5985f3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_5985f3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_5985f3();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl b/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl
deleted file mode 100644
index bc26c57..0000000
--- a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba32uint, write>) -> i32
-fn textureDimensions_5caa5e() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5caa5e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_5caa5e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_5caa5e();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.glsl
deleted file mode 100644
index ea9f7ed..0000000
--- a/test/tint/builtins/gen/textureDimensions/5caa5e.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_5caa5e() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_5caa5e();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_5caa5e() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_5caa5e();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_5caa5e() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_5caa5e();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl b/test/tint/builtins/gen/textureDimensions/5e295d.wgsl
deleted file mode 100644
index ed4854d..0000000
--- a/test/tint/builtins/gen/textureDimensions/5e295d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba16uint, write>) -> vec2<i32>
-fn textureDimensions_5e295d() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_5e295d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_5e295d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_5e295d();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl b/test/tint/builtins/gen/textureDimensions/60bf54.wgsl
deleted file mode 100644
index 1838e87..0000000
--- a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rg32sint, write>) -> vec3<i32>
-fn textureDimensions_60bf54() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_60bf54();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_60bf54();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_60bf54();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.glsl
deleted file mode 100644
index 3b56047..0000000
--- a/test/tint/builtins/gen/textureDimensions/60bf54.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage3D arg_0;
-void textureDimensions_60bf54() {
-  ivec3 res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_60bf54();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage3D arg_0;
-void textureDimensions_60bf54() {
-  ivec3 res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_60bf54();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage3D arg_0;
-void textureDimensions_60bf54() {
-  ivec3 res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_60bf54();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl b/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl
deleted file mode 100644
index b997655..0000000
--- a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rg32float, write>) -> vec3<i32>
-fn textureDimensions_63f3cf() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_63f3cf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_63f3cf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_63f3cf();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.glsl
deleted file mode 100644
index c209b77..0000000
--- a/test/tint/builtins/gen/textureDimensions/63f3cf.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image3D arg_0;
-void textureDimensions_63f3cf() {
-  ivec3 res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_63f3cf();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image3D arg_0;
-void textureDimensions_63f3cf() {
-  ivec3 res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_63f3cf();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image3D arg_0;
-void textureDimensions_63f3cf() {
-  ivec3 res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_63f3cf();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/68105c.wgsl b/test/tint/builtins/gen/textureDimensions/68105c.wgsl
deleted file mode 100644
index c3ab223..0000000
--- a/test/tint/builtins/gen/textureDimensions/68105c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba32uint, write>) -> vec2<i32>
-fn textureDimensions_68105c() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_68105c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_68105c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_68105c();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl b/test/tint/builtins/gen/textureDimensions/686ef2.wgsl
deleted file mode 100644
index 36f10f4..0000000
--- a/test/tint/builtins/gen/textureDimensions/686ef2.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<i32>;
-
-// fn textureDimensions(texture: texture_cube<i32>, level: i32) -> vec2<i32>
-fn textureDimensions_686ef2() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_686ef2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_686ef2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_686ef2();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl b/test/tint/builtins/gen/textureDimensions/6adac6.wgsl
deleted file mode 100644
index 4d454d1..0000000
--- a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba32sint, write>) -> i32
-fn textureDimensions_6adac6() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6adac6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_6adac6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_6adac6();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.glsl
deleted file mode 100644
index 6ebb1ce..0000000
--- a/test/tint/builtins/gen/textureDimensions/6adac6.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_6adac6() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_6adac6();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_6adac6() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_6adac6();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_6adac6() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_6adac6();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl b/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl
deleted file mode 100644
index 71ea69e..0000000
--- a/test/tint/builtins/gen/textureDimensions/6ec1b4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<u32>;
-
-// fn textureDimensions(texture: texture_3d<u32>) -> vec3<i32>
-fn textureDimensions_6ec1b4() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6ec1b4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_6ec1b4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_6ec1b4();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl b/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl
deleted file mode 100644
index 0be50aa..0000000
--- a/test/tint/builtins/gen/textureDimensions/6f0d79.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba8snorm, write>) -> vec2<i32>
-fn textureDimensions_6f0d79() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_6f0d79();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_6f0d79();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_6f0d79();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/702c53.wgsl b/test/tint/builtins/gen/textureDimensions/702c53.wgsl
deleted file mode 100644
index 7b217b3..0000000
--- a/test/tint/builtins/gen/textureDimensions/702c53.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba8unorm, write>) -> vec2<i32>
-fn textureDimensions_702c53() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_702c53();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_702c53();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_702c53();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl b/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl
deleted file mode 100644
index ba2e7b0..0000000
--- a/test/tint/builtins/gen/textureDimensions/72e5d6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-
-// fn textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
-fn textureDimensions_72e5d6() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_72e5d6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_72e5d6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_72e5d6();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/79df87.wgsl b/test/tint/builtins/gen/textureDimensions/79df87.wgsl
deleted file mode 100644
index 2c05574..0000000
--- a/test/tint/builtins/gen/textureDimensions/79df87.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<u32>;
-
-// fn textureDimensions(texture: texture_1d<u32>, level: i32) -> i32
-fn textureDimensions_79df87() {
-  var res: i32 = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_79df87();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_79df87();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_79df87();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.glsl
deleted file mode 100644
index b8ee4b2..0000000
--- a/test/tint/builtins/gen/textureDimensions/79df87.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureDimensions_79df87() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_79df87();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler1D arg_0_1;
-void textureDimensions_79df87() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void fragment_main() {
-  textureDimensions_79df87();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureDimensions_79df87() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void compute_main() {
-  textureDimensions_79df87();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl b/test/tint/builtins/gen/textureDimensions/7bf826.wgsl
deleted file mode 100644
index 6a2f24a..0000000
--- a/test/tint/builtins/gen/textureDimensions/7bf826.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-
-// fn textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
-fn textureDimensions_7bf826() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7bf826();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_7bf826();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_7bf826();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl b/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl
deleted file mode 100644
index 18bce03..0000000
--- a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rg32sint, write>) -> vec2<i32>
-fn textureDimensions_7f5c2e() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_7f5c2e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_7f5c2e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_7f5c2e();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.glsl
deleted file mode 100644
index 4e93c77..0000000
--- a/test/tint/builtins/gen/textureDimensions/7f5c2e.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2D arg_0;
-void textureDimensions_7f5c2e() {
-  ivec2 res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_7f5c2e();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage2D arg_0;
-void textureDimensions_7f5c2e() {
-  ivec2 res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_7f5c2e();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2D arg_0;
-void textureDimensions_7f5c2e() {
-  ivec2 res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_7f5c2e();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl b/test/tint/builtins/gen/textureDimensions/8028f3.wgsl
deleted file mode 100644
index b675213..0000000
--- a/test/tint/builtins/gen/textureDimensions/8028f3.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<r32float, write>) -> vec3<i32>
-fn textureDimensions_8028f3() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8028f3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_8028f3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_8028f3();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/811679.wgsl b/test/tint/builtins/gen/textureDimensions/811679.wgsl
deleted file mode 100644
index 9223f56..0000000
--- a/test/tint/builtins/gen/textureDimensions/811679.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba32uint, write>) -> vec3<i32>
-fn textureDimensions_811679() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_811679();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_811679();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_811679();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/820596.wgsl b/test/tint/builtins/gen/textureDimensions/820596.wgsl
deleted file mode 100644
index a6ff782..0000000
--- a/test/tint/builtins/gen/textureDimensions/820596.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rg32uint, write>) -> vec3<i32>
-fn textureDimensions_820596() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_820596();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_820596();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_820596();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.glsl
deleted file mode 100644
index 7dc7763..0000000
--- a/test/tint/builtins/gen/textureDimensions/820596.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage3D arg_0;
-void textureDimensions_820596() {
-  ivec3 res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_820596();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage3D arg_0;
-void textureDimensions_820596() {
-  ivec3 res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_820596();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage3D arg_0;
-void textureDimensions_820596() {
-  ivec3 res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_820596();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl b/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl
deleted file mode 100644
index 3ac74e8..0000000
--- a/test/tint/builtins/gen/textureDimensions/83ee5a.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba32sint, write>) -> vec2<i32>
-fn textureDimensions_83ee5a() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_83ee5a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_83ee5a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_83ee5a();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/85d556.wgsl b/test/tint/builtins/gen/textureDimensions/85d556.wgsl
deleted file mode 100644
index 628e35c..0000000
--- a/test/tint/builtins/gen/textureDimensions/85d556.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-
-// fn textureDimensions(texture: texture_2d_array<f32>, level: i32) -> vec2<i32>
-fn textureDimensions_85d556() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_85d556();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_85d556();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_85d556();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl b/test/tint/builtins/gen/textureDimensions/88ad17.wgsl
deleted file mode 100644
index 79eef6f..0000000
--- a/test/tint/builtins/gen/textureDimensions/88ad17.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<u32>;
-
-// fn textureDimensions(texture: texture_cube<u32>, level: i32) -> vec2<i32>
-fn textureDimensions_88ad17() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_88ad17();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_88ad17();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_88ad17();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl b/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl
deleted file mode 100644
index 4dd29cf..0000000
--- a/test/tint/builtins/gen/textureDimensions/8aa4c4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-
-// fn textureDimensions(texture: texture_3d<f32>) -> vec3<i32>
-fn textureDimensions_8aa4c4() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8aa4c4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_8aa4c4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_8aa4c4();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl b/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl
deleted file mode 100644
index d885845..0000000
--- a/test/tint/builtins/gen/textureDimensions/8deb5e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<i32>;
-
-// fn textureDimensions(texture: texture_3d<i32>) -> vec3<i32>
-fn textureDimensions_8deb5e() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8deb5e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_8deb5e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_8deb5e();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl b/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl
deleted file mode 100644
index 1af7247..0000000
--- a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-
-// fn textureDimensions(texture: texture_cube_array<f32>) -> vec2<i32>
-fn textureDimensions_8f20bf() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8f20bf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_8f20bf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_8f20bf();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.glsl
deleted file mode 100644
index 5c2fdc6..0000000
--- a/test/tint/builtins/gen/textureDimensions/8f20bf.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_8f20bf() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_8f20bf();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_8f20bf() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_8f20bf();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_8f20bf() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_8f20bf();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl b/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl
deleted file mode 100644
index a7cd8cf..0000000
--- a/test/tint/builtins/gen/textureDimensions/8fca0f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba32float, write>) -> vec3<i32>
-fn textureDimensions_8fca0f() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_8fca0f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_8fca0f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_8fca0f();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/90340b.wgsl b/test/tint/builtins/gen/textureDimensions/90340b.wgsl
deleted file mode 100644
index 842621e..0000000
--- a/test/tint/builtins/gen/textureDimensions/90340b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-
-// fn textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
-fn textureDimensions_90340b() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_90340b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_90340b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_90340b();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.glsl
deleted file mode 100644
index 142ad61..0000000
--- a/test/tint/builtins/gen/textureDimensions/90340b.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_90340b() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_90340b();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_90340b() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_90340b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_90340b() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_90340b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl b/test/tint/builtins/gen/textureDimensions/9042ab.wgsl
deleted file mode 100644
index fbdaabe..0000000
--- a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rg32uint, write>) -> vec2<i32>
-fn textureDimensions_9042ab() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9042ab();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9042ab();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9042ab();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.glsl
deleted file mode 100644
index b0f3eac..0000000
--- a/test/tint/builtins/gen/textureDimensions/9042ab.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureDimensions_9042ab() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_9042ab();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureDimensions_9042ab() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_9042ab();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureDimensions_9042ab() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-void compute_main() {
-  textureDimensions_9042ab();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl b/test/tint/builtins/gen/textureDimensions/9393b0.wgsl
deleted file mode 100644
index 0f6af45..0000000
--- a/test/tint/builtins/gen/textureDimensions/9393b0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-
-// fn textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
-fn textureDimensions_9393b0() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9393b0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9393b0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9393b0();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl b/test/tint/builtins/gen/textureDimensions/939fdb.wgsl
deleted file mode 100644
index 5914532..0000000
--- a/test/tint/builtins/gen/textureDimensions/939fdb.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-
-// fn textureDimensions(texture: texture_depth_2d) -> vec2<i32>
-fn textureDimensions_939fdb() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_939fdb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_939fdb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_939fdb();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl b/test/tint/builtins/gen/textureDimensions/962dcd.wgsl
deleted file mode 100644
index 5f24825..0000000
--- a/test/tint/builtins/gen/textureDimensions/962dcd.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<i32>;
-
-// fn textureDimensions(texture: texture_cube<i32>) -> vec2<i32>
-fn textureDimensions_962dcd() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_962dcd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_962dcd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_962dcd();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl b/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl
deleted file mode 100644
index 08c18fd..0000000
--- a/test/tint/builtins/gen/textureDimensions/9abfe5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba32float, write>) -> vec2<i32>
-fn textureDimensions_9abfe5() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9abfe5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9abfe5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9abfe5();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl b/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl
deleted file mode 100644
index 1ea3761..0000000
--- a/test/tint/builtins/gen/textureDimensions/9c9c57.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
-
-// fn textureDimensions(texture: texture_2d_array<i32>, level: i32) -> vec2<i32>
-fn textureDimensions_9c9c57() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9c9c57();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9c9c57();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9c9c57();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl b/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl
deleted file mode 100644
index 96b2672..0000000
--- a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba8sint, write>) -> i32
-fn textureDimensions_9da9e2() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9da9e2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9da9e2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9da9e2();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.glsl
deleted file mode 100644
index 52e2d90..0000000
--- a/test/tint/builtins/gen/textureDimensions/9da9e2.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_9da9e2() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_9da9e2();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_9da9e2() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_9da9e2();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_9da9e2() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_9da9e2();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl b/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl
deleted file mode 100644
index c2805cf..0000000
--- a/test/tint/builtins/gen/textureDimensions/9eb8d8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<r32uint, write>) -> vec2<i32>
-fn textureDimensions_9eb8d8() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9eb8d8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9eb8d8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9eb8d8();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl b/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl
deleted file mode 100644
index 810ecd5..0000000
--- a/test/tint/builtins/gen/textureDimensions/9f8e46.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-
-// fn textureDimensions(texture: texture_2d<f32>) -> vec2<i32>
-fn textureDimensions_9f8e46() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_9f8e46();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_9f8e46();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_9f8e46();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/a01845.wgsl b/test/tint/builtins/gen/textureDimensions/a01845.wgsl
deleted file mode 100644
index a3e1c14..0000000
--- a/test/tint/builtins/gen/textureDimensions/a01845.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-
-// fn textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
-fn textureDimensions_a01845() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a01845();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_a01845();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_a01845();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.glsl
deleted file mode 100644
index 691b98c..0000000
--- a/test/tint/builtins/gen/textureDimensions/a01845.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_a01845() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_a01845();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_a01845() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_a01845();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureDimensions_a01845() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_a01845();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl b/test/tint/builtins/gen/textureDimensions/a7d565.wgsl
deleted file mode 100644
index 904dbce..0000000
--- a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<u32>;
-
-// fn textureDimensions(texture: texture_1d<u32>) -> i32
-fn textureDimensions_a7d565() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a7d565();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_a7d565();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_a7d565();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.glsl
deleted file mode 100644
index e92841e..0000000
--- a/test/tint/builtins/gen/textureDimensions/a7d565.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureDimensions_a7d565() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_a7d565();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler1D arg_0_1;
-void textureDimensions_a7d565() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void fragment_main() {
-  textureDimensions_a7d565();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureDimensions_a7d565() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void compute_main() {
-  textureDimensions_a7d565();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl b/test/tint/builtins/gen/textureDimensions/a863f2.wgsl
deleted file mode 100644
index 6b5fdac..0000000
--- a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<r32float, write>) -> i32
-fn textureDimensions_a863f2() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a863f2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_a863f2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_a863f2();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.glsl
deleted file mode 100644
index b14d643..0000000
--- a/test/tint/builtins/gen/textureDimensions/a863f2.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(r32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_a863f2() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_a863f2();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(r32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_a863f2() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_a863f2();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(r32f) uniform highp writeonly image1D arg_0;
-void textureDimensions_a863f2() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_a863f2();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl b/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl
deleted file mode 100644
index 19cd6e1..0000000
--- a/test/tint/builtins/gen/textureDimensions/a9c9c1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-
-// fn textureDimensions(texture: texture_cube<f32>, level: i32) -> vec2<i32>
-fn textureDimensions_a9c9c1() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_a9c9c1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_a9c9c1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_a9c9c1();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl b/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl
deleted file mode 100644
index 4b25df8..0000000
--- a/test/tint/builtins/gen/textureDimensions/b0e16d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<i32>;
-
-// fn textureDimensions(texture: texture_2d<i32>, level: i32) -> vec2<i32>
-fn textureDimensions_b0e16d() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b0e16d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_b0e16d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_b0e16d();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl b/test/tint/builtins/gen/textureDimensions/b3c954.wgsl
deleted file mode 100644
index 588af6c8..0000000
--- a/test/tint/builtins/gen/textureDimensions/b3c954.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<u32>;
-
-// fn textureDimensions(texture: texture_cube<u32>) -> vec2<i32>
-fn textureDimensions_b3c954() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b3c954();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_b3c954();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_b3c954();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl b/test/tint/builtins/gen/textureDimensions/b3e407.wgsl
deleted file mode 100644
index 1c04110..0000000
--- a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<f32>;
-
-// fn textureDimensions(texture: texture_1d<f32>, level: i32) -> i32
-fn textureDimensions_b3e407() {
-  var res: i32 = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b3e407();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_b3e407();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_b3e407();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.glsl
deleted file mode 100644
index 1995074..0000000
--- a/test/tint/builtins/gen/textureDimensions/b3e407.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureDimensions_b3e407() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_b3e407();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler1D arg_0_1;
-void textureDimensions_b3e407() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void fragment_main() {
-  textureDimensions_b3e407();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'sampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureDimensions_b3e407() {
-  int res = textureSize(arg_0_1, 0);
-}
-
-void compute_main() {
-  textureDimensions_b3e407();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/b91240.wgsl b/test/tint/builtins/gen/textureDimensions/b91240.wgsl
deleted file mode 100644
index 4c8707c..0000000
--- a/test/tint/builtins/gen/textureDimensions/b91240.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba8snorm, write>) -> vec2<i32>
-fn textureDimensions_b91240() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_b91240();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_b91240();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_b91240();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl b/test/tint/builtins/gen/textureDimensions/ba1481.wgsl
deleted file mode 100644
index 521e1ce..0000000
--- a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_external;
-
-// fn textureDimensions(texture: texture_external) -> vec2<i32>
-fn textureDimensions_ba1481() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ba1481();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_ba1481();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_ba1481();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl b/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl
deleted file mode 100644
index b37b33e..0000000
--- a/test/tint/builtins/gen/textureDimensions/bb3dde.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba32sint, write>) -> vec3<i32>
-fn textureDimensions_bb3dde() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_bb3dde();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_bb3dde();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_bb3dde();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl b/test/tint/builtins/gen/textureDimensions/c30e75.wgsl
deleted file mode 100644
index d16d538..0000000
--- a/test/tint/builtins/gen/textureDimensions/c30e75.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<r32sint, write>) -> vec2<i32>
-fn textureDimensions_c30e75() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c30e75();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_c30e75();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_c30e75();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl b/test/tint/builtins/gen/textureDimensions/c7943d.wgsl
deleted file mode 100644
index 73cb2ca..0000000
--- a/test/tint/builtins/gen/textureDimensions/c7943d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<rgba8uint, write>) -> vec2<i32>
-fn textureDimensions_c7943d() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_c7943d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_c7943d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_c7943d();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl b/test/tint/builtins/gen/textureDimensions/cc968c.wgsl
deleted file mode 100644
index 89e9620..0000000
--- a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rg32sint, write>) -> i32
-fn textureDimensions_cc968c() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cc968c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_cc968c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_cc968c();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.glsl
deleted file mode 100644
index efc15a9..0000000
--- a/test/tint/builtins/gen/textureDimensions/cc968c.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_cc968c() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_cc968c();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_cc968c() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_cc968c();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage1D arg_0;
-void textureDimensions_cc968c() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_cc968c();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl b/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl
deleted file mode 100644
index a0738bc..0000000
--- a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba8snorm, write>) -> i32
-fn textureDimensions_cccc8f() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cccc8f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_cccc8f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_cccc8f();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.glsl
deleted file mode 100644
index eefeffa..0000000
--- a/test/tint/builtins/gen/textureDimensions/cccc8f.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
-void textureDimensions_cccc8f() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_cccc8f();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
-void textureDimensions_cccc8f() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_cccc8f();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
-void textureDimensions_cccc8f() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_cccc8f();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl b/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl
deleted file mode 100644
index 3bce5a6..0000000
--- a/test/tint/builtins/gen/textureDimensions/cd76a7.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba8unorm, write>) -> vec3<i32>
-fn textureDimensions_cd76a7() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cd76a7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_cd76a7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_cd76a7();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl b/test/tint/builtins/gen/textureDimensions/cdf473.wgsl
deleted file mode 100644
index db67b12..0000000
--- a/test/tint/builtins/gen/textureDimensions/cdf473.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rgba16sint, write>) -> vec2<i32>
-fn textureDimensions_cdf473() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cdf473();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_cdf473();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_cdf473();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/cec841.wgsl b/test/tint/builtins/gen/textureDimensions/cec841.wgsl
deleted file mode 100644
index 29e5903..0000000
--- a/test/tint/builtins/gen/textureDimensions/cec841.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-
-// fn textureDimensions(texture: texture_2d_array<f32>) -> vec2<i32>
-fn textureDimensions_cec841() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cec841();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_cec841();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_cec841();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl b/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl
deleted file mode 100644
index bd8e0bb..0000000
--- a/test/tint/builtins/gen/textureDimensions/cf7e43.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba8snorm, write>) -> vec3<i32>
-fn textureDimensions_cf7e43() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_cf7e43();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_cf7e43();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_cf7e43();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl b/test/tint/builtins/gen/textureDimensions/d125bc.wgsl
deleted file mode 100644
index d01cb35..0000000
--- a/test/tint/builtins/gen/textureDimensions/d125bc.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-
-// fn textureDimensions(texture: texture_cube<f32>) -> vec2<i32>
-fn textureDimensions_d125bc() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d125bc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_d125bc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_d125bc();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl b/test/tint/builtins/gen/textureDimensions/d83c45.wgsl
deleted file mode 100644
index 0cf8920..0000000
--- a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
-
-// fn textureDimensions(texture: texture_cube_array<u32>, level: i32) -> vec2<i32>
-fn textureDimensions_d83c45() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_d83c45();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_d83c45();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_d83c45();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.glsl
deleted file mode 100644
index eb69da3..0000000
--- a/test/tint/builtins/gen/textureDimensions/d83c45.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureDimensions_d83c45() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_d83c45();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureDimensions_d83c45() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_d83c45();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureDimensions_d83c45() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_d83c45();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl b/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl
deleted file mode 100644
index b7207bd..0000000
--- a/test/tint/builtins/gen/textureDimensions/daf7c0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
-
-// fn textureDimensions(texture: texture_multisampled_2d<i32>) -> vec2<i32>
-fn textureDimensions_daf7c0() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_daf7c0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_daf7c0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_daf7c0();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl b/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl
deleted file mode 100644
index bd87d0c..0000000
--- a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
-
-// fn textureDimensions(texture: texture_storage_1d<rgba8uint, write>) -> i32
-fn textureDimensions_dc2dd0() {
-  var res: i32 = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_dc2dd0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_dc2dd0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_dc2dd0();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.glsl
deleted file mode 100644
index 3122150..0000000
--- a/test/tint/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_dc2dd0() {
-  int res = imageSize(arg_0);
-}
-
-vec4 vertex_main() {
-  textureDimensions_dc2dd0();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_dc2dd0() {
-  int res = imageSize(arg_0);
-}
-
-void fragment_main() {
-  textureDimensions_dc2dd0();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
-void textureDimensions_dc2dd0() {
-  int res = imageSize(arg_0);
-}
-
-void compute_main() {
-  textureDimensions_dc2dd0();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/e927be.wgsl b/test/tint/builtins/gen/textureDimensions/e927be.wgsl
deleted file mode 100644
index 1deab90..0000000
--- a/test/tint/builtins/gen/textureDimensions/e927be.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
-
-// fn textureDimensions(texture: texture_cube_array<i32>) -> vec2<i32>
-fn textureDimensions_e927be() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e927be();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_e927be();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_e927be();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.glsl
deleted file mode 100644
index 9acd8d5..0000000
--- a/test/tint/builtins/gen/textureDimensions/e927be.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureDimensions_e927be() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_e927be();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureDimensions_e927be() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_e927be();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureDimensions_e927be() {
-  ivec2 res = textureSize(arg_0_1, 0).xy;
-}
-
-void compute_main() {
-  textureDimensions_e927be();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl b/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl
deleted file mode 100644
index f0967ab..0000000
--- a/test/tint/builtins/gen/textureDimensions/e9e96c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<r32float, write>) -> vec2<i32>
-fn textureDimensions_e9e96c() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_e9e96c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_e9e96c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_e9e96c();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl b/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl
deleted file mode 100644
index 5526818..0000000
--- a/test/tint/builtins/gen/textureDimensions/ef5b89.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
-
-// fn textureDimensions(texture: texture_multisampled_2d<f32>) -> vec2<i32>
-fn textureDimensions_ef5b89() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_ef5b89();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_ef5b89();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_ef5b89();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl b/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl
deleted file mode 100644
index 382191f..0000000
--- a/test/tint/builtins/gen/textureDimensions/efc8a4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<i32>;
-
-// fn textureDimensions(texture: texture_3d<i32>, level: i32) -> vec3<i32>
-fn textureDimensions_efc8a4() {
-  var res: vec3<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_efc8a4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_efc8a4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_efc8a4();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl b/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl
deleted file mode 100644
index 496b024..0000000
--- a/test/tint/builtins/gen/textureDimensions/f60bdb.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
-
-// fn textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
-fn textureDimensions_f60bdb() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f60bdb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_f60bdb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_f60bdb();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl b/test/tint/builtins/gen/textureDimensions/f7145b.wgsl
deleted file mode 100644
index 0c2834e..0000000
--- a/test/tint/builtins/gen/textureDimensions/f7145b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<u32>;
-
-// fn textureDimensions(texture: texture_2d<u32>, level: i32) -> vec2<i32>
-fn textureDimensions_f7145b() {
-  var res: vec2<i32> = textureDimensions(arg_0, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f7145b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_f7145b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_f7145b();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl b/test/tint/builtins/gen/textureDimensions/f931c7.wgsl
deleted file mode 100644
index 6dcbc80..0000000
--- a/test/tint/builtins/gen/textureDimensions/f931c7.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d<r32float, write>) -> vec2<i32>
-fn textureDimensions_f931c7() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_f931c7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_f931c7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_f931c7();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl b/test/tint/builtins/gen/textureDimensions/fa9859.wgsl
deleted file mode 100644
index 7c3d137..0000000
--- a/test/tint/builtins/gen/textureDimensions/fa9859.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<i32>;
-
-// fn textureDimensions(texture: texture_2d<i32>) -> vec2<i32>
-fn textureDimensions_fa9859() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fa9859();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_fa9859();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_fa9859();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl b/test/tint/builtins/gen/textureDimensions/fb5670.wgsl
deleted file mode 100644
index 73aa7aa..0000000
--- a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
-
-// fn textureDimensions(texture: texture_storage_2d_array<rg32float, write>) -> vec2<i32>
-fn textureDimensions_fb5670() {
-  var res: vec2<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fb5670();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_fb5670();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_fb5670();
-}
diff --git a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.glsl
deleted file mode 100644
index 515efe6..0000000
--- a/test/tint/builtins/gen/textureDimensions/fb5670.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureDimensions_fb5670() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-vec4 vertex_main() {
-  textureDimensions_fb5670();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureDimensions_fb5670() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-void fragment_main() {
-  textureDimensions_fb5670();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureDimensions_fb5670() {
-  ivec2 res = imageSize(arg_0).xy;
-}
-
-void compute_main() {
-  textureDimensions_fb5670();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl b/test/tint/builtins/gen/textureDimensions/fcac78.wgsl
deleted file mode 100644
index 8f5c0f0..0000000
--- a/test/tint/builtins/gen/textureDimensions/fcac78.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
-
-// fn textureDimensions(texture: texture_storage_3d<rgba8uint, write>) -> vec3<i32>
-fn textureDimensions_fcac78() {
-  var res: vec3<i32> = textureDimensions(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureDimensions_fcac78();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureDimensions_fcac78();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureDimensions_fcac78();
-}
diff --git a/test/tint/builtins/gen/textureGather/01305f.wgsl b/test/tint/builtins/gen/textureGather/01305f.wgsl
deleted file mode 100644
index fdb193f..0000000
--- a/test/tint/builtins/gen/textureGather/01305f.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d_array<u32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d_array<u32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<u32>
-fn textureGather_01305f() {
-  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_01305f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_01305f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_01305f();
-}
diff --git a/test/tint/builtins/gen/textureGather/06030a.wgsl b/test/tint/builtins/gen/textureGather/06030a.wgsl
deleted file mode 100644
index b2caaed..0000000
--- a/test/tint/builtins/gen/textureGather/06030a.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d_array<f32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
-fn textureGather_06030a() {
-  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_06030a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_06030a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_06030a();
-}
diff --git a/test/tint/builtins/gen/textureGather/10c554.wgsl b/test/tint/builtins/gen/textureGather/10c554.wgsl
deleted file mode 100644
index 28e958b..0000000
--- a/test/tint/builtins/gen/textureGather/10c554.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureGather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-fn textureGather_10c554() {
-  var res: vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_10c554();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_10c554();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_10c554();
-}
diff --git a/test/tint/builtins/gen/textureGather/15d79c.wgsl b/test/tint/builtins/gen/textureGather/15d79c.wgsl
deleted file mode 100644
index 37b88a0..0000000
--- a/test/tint/builtins/gen/textureGather/15d79c.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d<f32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
-fn textureGather_15d79c() {
-  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_15d79c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_15d79c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_15d79c();
-}
diff --git a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl b/test/tint/builtins/gen/textureGather/2e0ed5.wgsl
deleted file mode 100644
index 4b4d5bc..0000000
--- a/test/tint/builtins/gen/textureGather/2e0ed5.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureGather_2e0ed5() {
-  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_2e0ed5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_2e0ed5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_2e0ed5();
-}
diff --git a/test/tint/builtins/gen/textureGather/3112e8.wgsl b/test/tint/builtins/gen/textureGather/3112e8.wgsl
deleted file mode 100644
index cde5dd4..0000000
--- a/test/tint/builtins/gen/textureGather/3112e8.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_cube_array<f32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
-fn textureGather_3112e8() {
-  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_3112e8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_3112e8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_3112e8();
-}
diff --git a/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.glsl b/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.glsl
deleted file mode 100644
index f4c4935..0000000
--- a/test/tint/builtins/gen/textureGather/3112e8.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_1_arg_2;
-
-void textureGather_3112e8() {
-  vec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-vec4 vertex_main() {
-  textureGather_3112e8();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_1_arg_2;
-
-void textureGather_3112e8() {
-  vec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-void fragment_main() {
-  textureGather_3112e8();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_1_arg_2;
-
-void textureGather_3112e8() {
-  vec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-void compute_main() {
-  textureGather_3112e8();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureGather/3c527e.wgsl b/test/tint/builtins/gen/textureGather/3c527e.wgsl
deleted file mode 100644
index 5333748..0000000
--- a/test/tint/builtins/gen/textureGather/3c527e.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_cube_array<u32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_cube_array<u32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<u32>
-fn textureGather_3c527e() {
-  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_3c527e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_3c527e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_3c527e();
-}
diff --git a/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.glsl b/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.glsl
deleted file mode 100644
index 9f28e83..0000000
--- a/test/tint/builtins/gen/textureGather/3c527e.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_1_arg_2;
-
-void textureGather_3c527e() {
-  uvec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-vec4 vertex_main() {
-  textureGather_3c527e();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usamplerCubeArray arg_1_arg_2;
-
-void textureGather_3c527e() {
-  uvec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-void fragment_main() {
-  textureGather_3c527e();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_1_arg_2;
-
-void textureGather_3c527e() {
-  uvec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-void compute_main() {
-  textureGather_3c527e();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureGather/43025d.wgsl b/test/tint/builtins/gen/textureGather/43025d.wgsl
deleted file mode 100644
index 39681aa..0000000
--- a/test/tint/builtins/gen/textureGather/43025d.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureGather(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
-fn textureGather_43025d() {
-  var res: vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_43025d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_43025d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_43025d();
-}
diff --git a/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.glsl b/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.glsl
deleted file mode 100644
index 70b226f..0000000
--- a/test/tint/builtins/gen/textureGather/43025d.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureGather_43025d() {
-  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 0.0);
-}
-
-vec4 vertex_main() {
-  textureGather_43025d();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureGather_43025d() {
-  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 0.0);
-}
-
-void fragment_main() {
-  textureGather_43025d();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureGather_43025d() {
-  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 0.0);
-}
-
-void compute_main() {
-  textureGather_43025d();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureGather/4f2350.wgsl b/test/tint/builtins/gen/textureGather/4f2350.wgsl
deleted file mode 100644
index 27cb542..0000000
--- a/test/tint/builtins/gen/textureGather/4f2350.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d_array<i32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d_array<i32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<i32>
-fn textureGather_4f2350() {
-  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_4f2350();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_4f2350();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_4f2350();
-}
diff --git a/test/tint/builtins/gen/textureGather/51cf0b.wgsl b/test/tint/builtins/gen/textureGather/51cf0b.wgsl
deleted file mode 100644
index 3b42e5d..0000000
--- a/test/tint/builtins/gen/textureGather/51cf0b.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d_array<i32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d_array<i32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<i32>
-fn textureGather_51cf0b() {
-  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_51cf0b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_51cf0b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_51cf0b();
-}
diff --git a/test/tint/builtins/gen/textureGather/53ece6.wgsl b/test/tint/builtins/gen/textureGather/53ece6.wgsl
deleted file mode 100644
index fff75b6..0000000
--- a/test/tint/builtins/gen/textureGather/53ece6.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureGather(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
-fn textureGather_53ece6() {
-  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_53ece6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_53ece6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_53ece6();
-}
diff --git a/test/tint/builtins/gen/textureGather/57bfc6.wgsl b/test/tint/builtins/gen/textureGather/57bfc6.wgsl
deleted file mode 100644
index 66ab908..0000000
--- a/test/tint/builtins/gen/textureGather/57bfc6.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_cube<f32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-fn textureGather_57bfc6() {
-  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_57bfc6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_57bfc6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_57bfc6();
-}
diff --git a/test/tint/builtins/gen/textureGather/587ba3.wgsl b/test/tint/builtins/gen/textureGather/587ba3.wgsl
deleted file mode 100644
index 36138e2..0000000
--- a/test/tint/builtins/gen/textureGather/587ba3.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d<i32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d<i32>, sampler: sampler, coords: vec2<f32>) -> vec4<i32>
-fn textureGather_587ba3() {
-  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_587ba3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_587ba3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_587ba3();
-}
diff --git a/test/tint/builtins/gen/textureGather/69e0fb.wgsl b/test/tint/builtins/gen/textureGather/69e0fb.wgsl
deleted file mode 100644
index eefd176..0000000
--- a/test/tint/builtins/gen/textureGather/69e0fb.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d<i32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d<i32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<i32>
-fn textureGather_69e0fb() {
-  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_69e0fb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_69e0fb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_69e0fb();
-}
diff --git a/test/tint/builtins/gen/textureGather/93003d.wgsl b/test/tint/builtins/gen/textureGather/93003d.wgsl
deleted file mode 100644
index 2d1a14f..0000000
--- a/test/tint/builtins/gen/textureGather/93003d.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d<u32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d<u32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<u32>
-fn textureGather_93003d() {
-  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_93003d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_93003d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_93003d();
-}
diff --git a/test/tint/builtins/gen/textureGather/9a6358.wgsl b/test/tint/builtins/gen/textureGather/9a6358.wgsl
deleted file mode 100644
index fe03e14..0000000
--- a/test/tint/builtins/gen/textureGather/9a6358.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureGather(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
-fn textureGather_9a6358() {
-  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_9a6358();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_9a6358();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_9a6358();
-}
diff --git a/test/tint/builtins/gen/textureGather/9efca2.wgsl b/test/tint/builtins/gen/textureGather/9efca2.wgsl
deleted file mode 100644
index 01173de..0000000
--- a/test/tint/builtins/gen/textureGather/9efca2.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d_array<f32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
-fn textureGather_9efca2() {
-  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_9efca2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_9efca2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_9efca2();
-}
diff --git a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl b/test/tint/builtins/gen/textureGather/bd0b1e.wgsl
deleted file mode 100644
index eff100d..0000000
--- a/test/tint/builtins/gen/textureGather/bd0b1e.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d<f32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureGather_bd0b1e() {
-  var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_bd0b1e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_bd0b1e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_bd0b1e();
-}
diff --git a/test/tint/builtins/gen/textureGather/c409ae.wgsl b/test/tint/builtins/gen/textureGather/c409ae.wgsl
deleted file mode 100644
index 5ce1643..0000000
--- a/test/tint/builtins/gen/textureGather/c409ae.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
-fn textureGather_c409ae() {
-  var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_c409ae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_c409ae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_c409ae();
-}
diff --git a/test/tint/builtins/gen/textureGather/c55822.wgsl b/test/tint/builtins/gen/textureGather/c55822.wgsl
deleted file mode 100644
index 7c60b3e..0000000
--- a/test/tint/builtins/gen/textureGather/c55822.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_cube_array<i32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_cube_array<i32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<i32>
-fn textureGather_c55822() {
-  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_c55822();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_c55822();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_c55822();
-}
diff --git a/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.glsl b/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.glsl
deleted file mode 100644
index ff259fb..0000000
--- a/test/tint/builtins/gen/textureGather/c55822.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_1_arg_2;
-
-void textureGather_c55822() {
-  ivec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-vec4 vertex_main() {
-  textureGather_c55822();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isamplerCubeArray arg_1_arg_2;
-
-void textureGather_c55822() {
-  ivec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-void fragment_main() {
-  textureGather_c55822();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_1_arg_2;
-
-void textureGather_c55822() {
-  ivec4 res = textureGather(arg_1_arg_2, vec4(0.0f, 0.0f, 0.0f, float(1)), 1);
-}
-
-void compute_main() {
-  textureGather_c55822();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureGather/e1b67d.wgsl b/test/tint/builtins/gen/textureGather/e1b67d.wgsl
deleted file mode 100644
index 1745a44..0000000
--- a/test/tint/builtins/gen/textureGather/e1b67d.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_cube<u32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_cube<u32>, sampler: sampler, coords: vec3<f32>) -> vec4<u32>
-fn textureGather_e1b67d() {
-  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_e1b67d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_e1b67d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_e1b67d();
-}
diff --git a/test/tint/builtins/gen/textureGather/e9eff6.wgsl b/test/tint/builtins/gen/textureGather/e9eff6.wgsl
deleted file mode 100644
index cc3356e..0000000
--- a/test/tint/builtins/gen/textureGather/e9eff6.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d<u32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d<u32>, sampler: sampler, coords: vec2<f32>) -> vec4<u32>
-fn textureGather_e9eff6() {
-  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_e9eff6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_e9eff6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_e9eff6();
-}
diff --git a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl b/test/tint/builtins/gen/textureGather/f5f3ba.wgsl
deleted file mode 100644
index 739a99b..0000000
--- a/test/tint/builtins/gen/textureGather/f5f3ba.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_2d_array<u32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_2d_array<u32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<u32>
-fn textureGather_f5f3ba() {
-  var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_f5f3ba();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_f5f3ba();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_f5f3ba();
-}
diff --git a/test/tint/builtins/gen/textureGather/f7995a.wgsl b/test/tint/builtins/gen/textureGather/f7995a.wgsl
deleted file mode 100644
index ef2624f..0000000
--- a/test/tint/builtins/gen/textureGather/f7995a.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(1) var arg_1: texture_cube<i32>;
-@group(1) @binding(2) var arg_2: sampler;
-
-// fn textureGather(component: i32, texture: texture_cube<i32>, sampler: sampler, coords: vec3<f32>) -> vec4<i32>
-fn textureGather_f7995a() {
-  var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGather_f7995a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGather_f7995a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGather_f7995a();
-}
diff --git a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl b/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl
deleted file mode 100644
index 90ba7db..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/182fd4.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureGatherCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32>
-fn textureGatherCompare_182fd4() {
-  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGatherCompare_182fd4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGatherCompare_182fd4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGatherCompare_182fd4();
-}
diff --git a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl b/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl
deleted file mode 100644
index 4fe0fc7..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureGatherCompare(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> vec4<f32>
-fn textureGatherCompare_60d2d1() {
-  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGatherCompare_60d2d1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGatherCompare_60d2d1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGatherCompare_60d2d1();
-}
diff --git a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.glsl b/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.glsl
deleted file mode 100644
index d2fdd93..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/60d2d1.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureGatherCompare_60d2d1() {
-  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-vec4 vertex_main() {
-  textureGatherCompare_60d2d1();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureGatherCompare_60d2d1() {
-  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-void fragment_main() {
-  textureGatherCompare_60d2d1();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureGatherCompare_60d2d1() {
-  vec4 res = textureGather(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-void compute_main() {
-  textureGatherCompare_60d2d1();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl b/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl
deleted file mode 100644
index e58b377..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/6d9352.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> vec4<f32>
-fn textureGatherCompare_6d9352() {
-  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGatherCompare_6d9352();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGatherCompare_6d9352();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGatherCompare_6d9352();
-}
diff --git a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl b/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl
deleted file mode 100644
index b3b015d..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/6f1267.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureGatherCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> vec4<f32>
-fn textureGatherCompare_6f1267() {
-  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGatherCompare_6f1267();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGatherCompare_6f1267();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGatherCompare_6f1267();
-}
diff --git a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl b/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl
deleted file mode 100644
index cb6fb6d..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/783e65.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureGatherCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> vec4<f32>
-fn textureGatherCompare_783e65() {
-  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGatherCompare_783e65();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGatherCompare_783e65();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGatherCompare_783e65();
-}
diff --git a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl b/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl
deleted file mode 100644
index 3a2d011..0000000
--- a/test/tint/builtins/gen/textureGatherCompare/a5f587.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> vec4<f32>
-fn textureGatherCompare_a5f587() {
-  var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureGatherCompare_a5f587();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureGatherCompare_a5f587();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureGatherCompare_a5f587();
-}
diff --git a/test/tint/builtins/gen/textureLoad/19cf87.wgsl b/test/tint/builtins/gen/textureLoad/19cf87.wgsl
deleted file mode 100644
index be3267a..0000000
--- a/test/tint/builtins/gen/textureLoad/19cf87.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-
-// fn textureLoad(texture: texture_depth_2d, coords: vec2<i32>, level: i32) -> f32
-fn textureLoad_19cf87() {
-  var res: f32 = textureLoad(arg_0, vec2<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_19cf87();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_19cf87();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_19cf87();
-}
diff --git a/test/tint/builtins/gen/textureLoad/1b8588.wgsl b/test/tint/builtins/gen/textureLoad/1b8588.wgsl
deleted file mode 100644
index f83d3bc..0000000
--- a/test/tint/builtins/gen/textureLoad/1b8588.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<u32>;
-
-// fn textureLoad(texture: texture_1d<u32>, coords: i32, level: i32) -> vec4<u32>
-fn textureLoad_1b8588() {
-  var res: vec4<u32> = textureLoad(arg_0, 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_1b8588();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_1b8588();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_1b8588();
-}
diff --git a/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.glsl b/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.glsl
deleted file mode 100644
index 147694e..0000000
--- a/test/tint/builtins/gen/textureLoad/1b8588.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureLoad_1b8588() {
-  uvec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-vec4 vertex_main() {
-  textureLoad_1b8588();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler1D arg_0_1;
-void textureLoad_1b8588() {
-  uvec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-void fragment_main() {
-  textureLoad_1b8588();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureLoad_1b8588() {
-  uvec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-void compute_main() {
-  textureLoad_1b8588();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureLoad/1f2016.wgsl b/test/tint/builtins/gen/textureLoad/1f2016.wgsl
deleted file mode 100644
index 078f87b..0000000
--- a/test/tint/builtins/gen/textureLoad/1f2016.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-
-// fn textureLoad(texture: texture_3d<f32>, coords: vec3<i32>, level: i32) -> vec4<f32>
-fn textureLoad_1f2016() {
-  var res: vec4<f32> = textureLoad(arg_0, vec3<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_1f2016();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_1f2016();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_1f2016();
-}
diff --git a/test/tint/builtins/gen/textureLoad/484344.wgsl b/test/tint/builtins/gen/textureLoad/484344.wgsl
deleted file mode 100644
index 498efda..0000000
--- a/test/tint/builtins/gen/textureLoad/484344.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-
-// fn textureLoad(texture: texture_2d<f32>, coords: vec2<i32>, level: i32) -> vec4<f32>
-fn textureLoad_484344() {
-  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_484344();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_484344();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_484344();
-}
diff --git a/test/tint/builtins/gen/textureLoad/4fd803.wgsl b/test/tint/builtins/gen/textureLoad/4fd803.wgsl
deleted file mode 100644
index 9d60c25..0000000
--- a/test/tint/builtins/gen/textureLoad/4fd803.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<i32>;
-
-// fn textureLoad(texture: texture_3d<i32>, coords: vec3<i32>, level: i32) -> vec4<i32>
-fn textureLoad_4fd803() {
-  var res: vec4<i32> = textureLoad(arg_0, vec3<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_4fd803();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_4fd803();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_4fd803();
-}
diff --git a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl b/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl
deleted file mode 100644
index 1f1e1e1..0000000
--- a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<i32>;
-
-// fn textureLoad(texture: texture_1d<i32>, coords: i32, level: i32) -> vec4<i32>
-fn textureLoad_5a2f9d() {
-  var res: vec4<i32> = textureLoad(arg_0, 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_5a2f9d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_5a2f9d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_5a2f9d();
-}
diff --git a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.glsl b/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.glsl
deleted file mode 100644
index 457ddc9..0000000
--- a/test/tint/builtins/gen/textureLoad/5a2f9d.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureLoad_5a2f9d() {
-  ivec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-vec4 vertex_main() {
-  textureLoad_5a2f9d();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler1D arg_0_1;
-void textureLoad_5a2f9d() {
-  ivec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-void fragment_main() {
-  textureLoad_5a2f9d();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureLoad_5a2f9d() {
-  ivec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-void compute_main() {
-  textureLoad_5a2f9d();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureLoad/6154d4.wgsl b/test/tint/builtins/gen/textureLoad/6154d4.wgsl
deleted file mode 100644
index 6078b2d..0000000
--- a/test/tint/builtins/gen/textureLoad/6154d4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<u32>;
-
-// fn textureLoad(texture: texture_2d<u32>, coords: vec2<i32>, level: i32) -> vec4<u32>
-fn textureLoad_6154d4() {
-  var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_6154d4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_6154d4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_6154d4();
-}
diff --git a/test/tint/builtins/gen/textureLoad/6273b1.wgsl b/test/tint/builtins/gen/textureLoad/6273b1.wgsl
deleted file mode 100644
index 0bc163f..0000000
--- a/test/tint/builtins/gen/textureLoad/6273b1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
-
-// fn textureLoad(texture: texture_depth_multisampled_2d, coords: vec2<i32>, sample_index: i32) -> f32
-fn textureLoad_6273b1() {
-  var res: f32 = textureLoad(arg_0, vec2<i32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_6273b1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_6273b1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_6273b1();
-}
diff --git a/test/tint/builtins/gen/textureLoad/79e697.wgsl b/test/tint/builtins/gen/textureLoad/79e697.wgsl
deleted file mode 100644
index 195a489..0000000
--- a/test/tint/builtins/gen/textureLoad/79e697.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
-
-// fn textureLoad(texture: texture_2d_array<i32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<i32>
-fn textureLoad_79e697() {
-  var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_79e697();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_79e697();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_79e697();
-}
diff --git a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl b/test/tint/builtins/gen/textureLoad/7c90e5.wgsl
deleted file mode 100644
index 231d9c5..0000000
--- a/test/tint/builtins/gen/textureLoad/7c90e5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
-
-// fn textureLoad(texture: texture_2d_array<u32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<u32>
-fn textureLoad_7c90e5() {
-  var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_7c90e5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_7c90e5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_7c90e5();
-}
diff --git a/test/tint/builtins/gen/textureLoad/81c381.wgsl b/test/tint/builtins/gen/textureLoad/81c381.wgsl
deleted file mode 100644
index b68c0de..0000000
--- a/test/tint/builtins/gen/textureLoad/81c381.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<f32>;
-
-// fn textureLoad(texture: texture_1d<f32>, coords: i32, level: i32) -> vec4<f32>
-fn textureLoad_81c381() {
-  var res: vec4<f32> = textureLoad(arg_0, 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_81c381();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_81c381();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_81c381();
-}
diff --git a/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.glsl b/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.glsl
deleted file mode 100644
index e18d7c3..0000000
--- a/test/tint/builtins/gen/textureLoad/81c381.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureLoad_81c381() {
-  vec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-vec4 vertex_main() {
-  textureLoad_81c381();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler1D arg_0_1;
-void textureLoad_81c381() {
-  vec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-void fragment_main() {
-  textureLoad_81c381();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'sampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureLoad_81c381() {
-  vec4 res = texelFetch(arg_0_1, 1, 0);
-}
-
-void compute_main() {
-  textureLoad_81c381();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureLoad/87be85.wgsl b/test/tint/builtins/gen/textureLoad/87be85.wgsl
deleted file mode 100644
index 1440343..0000000
--- a/test/tint/builtins/gen/textureLoad/87be85.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-
-// fn textureLoad(texture: texture_2d_array<f32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<f32>
-fn textureLoad_87be85() {
-  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_87be85();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_87be85();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_87be85();
-}
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl b/test/tint/builtins/gen/textureLoad/8acf41.wgsl
deleted file mode 100644
index 25aff6c..0000000
--- a/test/tint/builtins/gen/textureLoad/8acf41.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_external;
-
-// fn textureLoad(texture: texture_external, coords: vec2<i32>) -> vec4<f32>
-fn textureLoad_8acf41() {
-  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_8acf41();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_8acf41();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_8acf41();
-}
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl b/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl
deleted file mode 100644
index db3cd70..0000000
--- a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl
+++ /dev/null
@@ -1,171 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-} ext_tex_params;
-
-vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
-  if ((params.numPlanes == 1u)) {
-    return texelFetch(plane0_1, coord, 0);
-  }
-  float y = (texelFetch(plane0_1, coord, 0).r - 0.0625f);
-  vec2 uv = (texelFetch(plane1_1, coord, 0).rg - 0.5f);
-  float u = uv.x;
-  float v = uv.y;
-  float r = ((1.164000034f * y) + (params.vr * v));
-  float g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
-  float b = ((1.164000034f * y) + (params.ub * u));
-  return vec4(r, g, b, 1.0f);
-}
-
-uniform highp sampler2D arg_0_1;
-uniform highp sampler2D ext_tex_plane_1_1;
-void textureLoad_8acf41() {
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0, 0), ext_tex_params);
-}
-
-vec4 vertex_main() {
-  textureLoad_8acf41();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:36: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:36: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:36: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-} ext_tex_params;
-
-vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
-  if ((params.numPlanes == 1u)) {
-    return texelFetch(plane0_1, coord, 0);
-  }
-  float y = (texelFetch(plane0_1, coord, 0).r - 0.0625f);
-  vec2 uv = (texelFetch(plane1_1, coord, 0).rg - 0.5f);
-  float u = uv.x;
-  float v = uv.y;
-  float r = ((1.164000034f * y) + (params.vr * v));
-  float g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
-  float b = ((1.164000034f * y) + (params.ub * u));
-  return vec4(r, g, b, 1.0f);
-}
-
-uniform highp sampler2D arg_0_1;
-uniform highp sampler2D ext_tex_plane_1_1;
-void textureLoad_8acf41() {
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0, 0), ext_tex_params);
-}
-
-void fragment_main() {
-  textureLoad_8acf41();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:37: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-} ext_tex_params;
-
-vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
-  if ((params.numPlanes == 1u)) {
-    return texelFetch(plane0_1, coord, 0);
-  }
-  float y = (texelFetch(plane0_1, coord, 0).r - 0.0625f);
-  vec2 uv = (texelFetch(plane1_1, coord, 0).rg - 0.5f);
-  float u = uv.x;
-  float v = uv.y;
-  float r = ((1.164000034f * y) + (params.vr * v));
-  float g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
-  float b = ((1.164000034f * y) + (params.ub * u));
-  return vec4(r, g, b, 1.0f);
-}
-
-uniform highp sampler2D arg_0_1;
-uniform highp sampler2D ext_tex_plane_1_1;
-void textureLoad_8acf41() {
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0, 0), ext_tex_params);
-}
-
-void compute_main() {
-  textureLoad_8acf41();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:36: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:36: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:36: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureLoad/9b2667.wgsl b/test/tint/builtins/gen/textureLoad/9b2667.wgsl
deleted file mode 100644
index 73c2c31..0000000
--- a/test/tint/builtins/gen/textureLoad/9b2667.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-
-// fn textureLoad(texture: texture_depth_2d_array, coords: vec2<i32>, array_index: i32, level: i32) -> f32
-fn textureLoad_9b2667() {
-  var res: f32 = textureLoad(arg_0, vec2<i32>(), 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_9b2667();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_9b2667();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_9b2667();
-}
diff --git a/test/tint/builtins/gen/textureLoad/a583c9.wgsl b/test/tint/builtins/gen/textureLoad/a583c9.wgsl
deleted file mode 100644
index 9ed4ae7..0000000
--- a/test/tint/builtins/gen/textureLoad/a583c9.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
-
-// fn textureLoad(texture: texture_multisampled_2d<f32>, coords: vec2<i32>, sample_index: i32) -> vec4<f32>
-fn textureLoad_a583c9() {
-  var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_a583c9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_a583c9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_a583c9();
-}
diff --git a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl b/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl
deleted file mode 100644
index 095314d..0000000
--- a/test/tint/builtins/gen/textureLoad/a9a9f5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<u32>;
-
-// fn textureLoad(texture: texture_3d<u32>, coords: vec3<i32>, level: i32) -> vec4<u32>
-fn textureLoad_a9a9f5() {
-  var res: vec4<u32> = textureLoad(arg_0, vec3<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_a9a9f5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_a9a9f5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_a9a9f5();
-}
diff --git a/test/tint/builtins/gen/textureLoad/c2a480.wgsl b/test/tint/builtins/gen/textureLoad/c2a480.wgsl
deleted file mode 100644
index b3ebdcc..0000000
--- a/test/tint/builtins/gen/textureLoad/c2a480.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<i32>;
-
-// fn textureLoad(texture: texture_2d<i32>, coords: vec2<i32>, level: i32) -> vec4<i32>
-fn textureLoad_c2a480() {
-  var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_c2a480();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_c2a480();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_c2a480();
-}
diff --git a/test/tint/builtins/gen/textureLoad/c378ee.wgsl b/test/tint/builtins/gen/textureLoad/c378ee.wgsl
deleted file mode 100644
index 4d56e20..0000000
--- a/test/tint/builtins/gen/textureLoad/c378ee.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
-
-// fn textureLoad(texture: texture_multisampled_2d<u32>, coords: vec2<i32>, sample_index: i32) -> vec4<u32>
-fn textureLoad_c378ee() {
-  var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_c378ee();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_c378ee();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_c378ee();
-}
diff --git a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl b/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl
deleted file mode 100644
index 1a097e7..0000000
--- a/test/tint/builtins/gen/textureLoad/e3d2cc.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
-
-// fn textureLoad(texture: texture_multisampled_2d<i32>, coords: vec2<i32>, sample_index: i32) -> vec4<i32>
-fn textureLoad_e3d2cc() {
-  var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureLoad_e3d2cc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureLoad_e3d2cc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureLoad_e3d2cc();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/024820.wgsl b/test/tint/builtins/gen/textureNumLayers/024820.wgsl
deleted file mode 100644
index 99a5031..0000000
--- a/test/tint/builtins/gen/textureNumLayers/024820.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-
-// fn textureNumLayers(texture: texture_2d_array<f32>) -> i32
-fn textureNumLayers_024820() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_024820();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_024820();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_024820();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl b/test/tint/builtins/gen/textureNumLayers/053df7.wgsl
deleted file mode 100644
index 9595a93..0000000
--- a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
-
-// fn textureNumLayers(texture: texture_cube_array<u32>) -> i32
-fn textureNumLayers_053df7() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_053df7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_053df7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_053df7();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.glsl
deleted file mode 100644
index 89d39c3..0000000
--- a/test/tint/builtins/gen/textureNumLayers/053df7.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureNumLayers_053df7() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_053df7();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureNumLayers_053df7() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_053df7();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureNumLayers_053df7() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void compute_main() {
-  textureNumLayers_053df7();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl b/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl
deleted file mode 100644
index fe75056..0000000
--- a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rg32sint, write>) -> i32
-fn textureNumLayers_058cc3() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_058cc3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_058cc3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_058cc3();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.glsl
deleted file mode 100644
index 21eb267..0000000
--- a/test/tint/builtins/gen/textureNumLayers/058cc3.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureNumLayers_058cc3() {
-  int res = imageSize(arg_0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_058cc3();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureNumLayers_058cc3() {
-  int res = imageSize(arg_0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_058cc3();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureNumLayers_058cc3() {
-  int res = imageSize(arg_0).z;
-}
-
-void compute_main() {
-  textureNumLayers_058cc3();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl b/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl
deleted file mode 100644
index 9e8fd7c..0000000
--- a/test/tint/builtins/gen/textureNumLayers/09d05d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba8unorm, write>) -> i32
-fn textureNumLayers_09d05d() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_09d05d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_09d05d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_09d05d();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl b/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl
deleted file mode 100644
index 941d8f6..0000000
--- a/test/tint/builtins/gen/textureNumLayers/13b4ce.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba32sint, write>) -> i32
-fn textureNumLayers_13b4ce() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_13b4ce();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_13b4ce();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_13b4ce();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl b/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl
deleted file mode 100644
index e2c96d7..0000000
--- a/test/tint/builtins/gen/textureNumLayers/22e53b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<r32sint, write>) -> i32
-fn textureNumLayers_22e53b() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_22e53b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_22e53b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_22e53b();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/562013.wgsl b/test/tint/builtins/gen/textureNumLayers/562013.wgsl
deleted file mode 100644
index aac18a1..0000000
--- a/test/tint/builtins/gen/textureNumLayers/562013.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba16float, write>) -> i32
-fn textureNumLayers_562013() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_562013();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_562013();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_562013();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl b/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl
deleted file mode 100644
index edf197f..0000000
--- a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-
-// fn textureNumLayers(texture: texture_cube_array<f32>) -> i32
-fn textureNumLayers_5d59cd() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_5d59cd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_5d59cd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_5d59cd();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.glsl
deleted file mode 100644
index 8d21f6d..0000000
--- a/test/tint/builtins/gen/textureNumLayers/5d59cd.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLayers_5d59cd() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_5d59cd();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLayers_5d59cd() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_5d59cd();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLayers_5d59cd() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void compute_main() {
-  textureNumLayers_5d59cd();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl b/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl
deleted file mode 100644
index 6743ff5..0000000
--- a/test/tint/builtins/gen/textureNumLayers/68a65b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba32float, write>) -> i32
-fn textureNumLayers_68a65b() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_68a65b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_68a65b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_68a65b();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl b/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl
deleted file mode 100644
index 2574c2a..0000000
--- a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-
-// fn textureNumLayers(texture: texture_depth_cube_array) -> i32
-fn textureNumLayers_778bd1() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_778bd1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_778bd1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_778bd1();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.glsl
deleted file mode 100644
index b4b76bf..0000000
--- a/test/tint/builtins/gen/textureNumLayers/778bd1.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLayers_778bd1() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_778bd1();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLayers_778bd1() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_778bd1();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLayers_778bd1() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void compute_main() {
-  textureNumLayers_778bd1();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl b/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl
deleted file mode 100644
index ed7014f..0000000
--- a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rg32float, write>) -> i32
-fn textureNumLayers_7f1937() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_7f1937();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_7f1937();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_7f1937();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.glsl
deleted file mode 100644
index 33bd398..0000000
--- a/test/tint/builtins/gen/textureNumLayers/7f1937.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureNumLayers_7f1937() {
-  int res = imageSize(arg_0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_7f1937();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureNumLayers_7f1937() {
-  int res = imageSize(arg_0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_7f1937();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureNumLayers_7f1937() {
-  int res = imageSize(arg_0).z;
-}
-
-void compute_main() {
-  textureNumLayers_7f1937();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl b/test/tint/builtins/gen/textureNumLayers/85f980.wgsl
deleted file mode 100644
index e01f576..0000000
--- a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
-
-// fn textureNumLayers(texture: texture_cube_array<i32>) -> i32
-fn textureNumLayers_85f980() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_85f980();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_85f980();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_85f980();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.glsl
deleted file mode 100644
index 22a9c53..0000000
--- a/test/tint/builtins/gen/textureNumLayers/85f980.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureNumLayers_85f980() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_85f980();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureNumLayers_85f980() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_85f980();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureNumLayers_85f980() {
-  int res = textureSize(arg_0_1, 0).z;
-}
-
-void compute_main() {
-  textureNumLayers_85f980();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl b/test/tint/builtins/gen/textureNumLayers/87953e.wgsl
deleted file mode 100644
index 00db05e..0000000
--- a/test/tint/builtins/gen/textureNumLayers/87953e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
-
-// fn textureNumLayers(texture: texture_2d_array<u32>) -> i32
-fn textureNumLayers_87953e() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_87953e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_87953e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_87953e();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl b/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl
deleted file mode 100644
index 3b58ba3..0000000
--- a/test/tint/builtins/gen/textureNumLayers/893e7c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
-
-// fn textureNumLayers(texture: texture_2d_array<i32>) -> i32
-fn textureNumLayers_893e7c() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_893e7c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_893e7c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_893e7c();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl b/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl
deleted file mode 100644
index d02558b..0000000
--- a/test/tint/builtins/gen/textureNumLayers/9700fb.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba16uint, write>) -> i32
-fn textureNumLayers_9700fb() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_9700fb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_9700fb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_9700fb();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl b/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl
deleted file mode 100644
index 1bf60ba..0000000
--- a/test/tint/builtins/gen/textureNumLayers/a216d2.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba8sint, write>) -> i32
-fn textureNumLayers_a216d2() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_a216d2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_a216d2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_a216d2();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl b/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl
deleted file mode 100644
index af6c7086..0000000
--- a/test/tint/builtins/gen/textureNumLayers/cd5dc8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba32uint, write>) -> i32
-fn textureNumLayers_cd5dc8() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_cd5dc8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_cd5dc8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_cd5dc8();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl b/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl
deleted file mode 100644
index df5ccbd..0000000
--- a/test/tint/builtins/gen/textureNumLayers/d5b228.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<r32float, write>) -> i32
-fn textureNumLayers_d5b228() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_d5b228();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_d5b228();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_d5b228();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl b/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl
deleted file mode 100644
index a7f2c8c..0000000
--- a/test/tint/builtins/gen/textureNumLayers/e31be1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba8snorm, write>) -> i32
-fn textureNumLayers_e31be1() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_e31be1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_e31be1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_e31be1();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl b/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl
deleted file mode 100644
index cb9d362..0000000
--- a/test/tint/builtins/gen/textureNumLayers/e653c0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-
-// fn textureNumLayers(texture: texture_depth_2d_array) -> i32
-fn textureNumLayers_e653c0() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_e653c0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_e653c0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_e653c0();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl b/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl
deleted file mode 100644
index 5ebae3d..0000000
--- a/test/tint/builtins/gen/textureNumLayers/ee942f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<r32uint, write>) -> i32
-fn textureNumLayers_ee942f() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_ee942f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_ee942f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_ee942f();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl b/test/tint/builtins/gen/textureNumLayers/f33005.wgsl
deleted file mode 100644
index d12cb26..0000000
--- a/test/tint/builtins/gen/textureNumLayers/f33005.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba16sint, write>) -> i32
-fn textureNumLayers_f33005() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_f33005();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_f33005();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_f33005();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl b/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl
deleted file mode 100644
index e99f075..0000000
--- a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rg32uint, write>) -> i32
-fn textureNumLayers_fcec98() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_fcec98();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_fcec98();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_fcec98();
-}
diff --git a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.glsl
deleted file mode 100644
index 0befb0d..0000000
--- a/test/tint/builtins/gen/textureNumLayers/fcec98.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureNumLayers_fcec98() {
-  int res = imageSize(arg_0).z;
-}
-
-vec4 vertex_main() {
-  textureNumLayers_fcec98();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureNumLayers_fcec98() {
-  int res = imageSize(arg_0).z;
-}
-
-void fragment_main() {
-  textureNumLayers_fcec98();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureNumLayers_fcec98() {
-  int res = imageSize(arg_0).z;
-}
-
-void compute_main() {
-  textureNumLayers_fcec98();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl b/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl
deleted file mode 100644
index 3d50b4f..0000000
--- a/test/tint/builtins/gen/textureNumLayers/ff5e89.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
-
-// fn textureNumLayers(texture: texture_storage_2d_array<rgba8uint, write>) -> i32
-fn textureNumLayers_ff5e89() {
-  var res: i32 = textureNumLayers(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLayers_ff5e89();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLayers_ff5e89();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLayers_ff5e89();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl b/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl
deleted file mode 100644
index 63b7ea4..0000000
--- a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-
-// fn textureNumLevels(texture: texture_depth_cube) -> i32
-fn textureNumLevels_076cb5() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_076cb5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_076cb5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_076cb5();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.glsl
deleted file mode 100644
index 492973a..0000000
--- a/test/tint/builtins/gen/textureNumLevels/076cb5.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCube arg_0_1;
-void textureNumLevels_076cb5() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_076cb5();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCube arg_0_1;
-void textureNumLevels_076cb5() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_076cb5();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCube arg_0_1;
-void textureNumLevels_076cb5() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_076cb5();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl b/test/tint/builtins/gen/textureNumLevels/080d95.wgsl
deleted file mode 100644
index ded52c9..0000000
--- a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<i32>;
-
-// fn textureNumLevels(texture: texture_cube<i32>) -> i32
-fn textureNumLevels_080d95() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_080d95();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_080d95();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_080d95();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.glsl
deleted file mode 100644
index 39d54d2..0000000
--- a/test/tint/builtins/gen/textureNumLevels/080d95.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isamplerCube arg_0_1;
-void textureNumLevels_080d95() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_080d95();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isamplerCube arg_0_1;
-void textureNumLevels_080d95() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_080d95();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isamplerCube arg_0_1;
-void textureNumLevels_080d95() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_080d95();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl b/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl
deleted file mode 100644
index e843a19..0000000
--- a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<u32>;
-
-// fn textureNumLevels(texture: texture_2d<u32>) -> i32
-fn textureNumLevels_09ddd0() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_09ddd0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_09ddd0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_09ddd0();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.glsl
deleted file mode 100644
index 642d738..0000000
--- a/test/tint/builtins/gen/textureNumLevels/09ddd0.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler2D arg_0_1;
-void textureNumLevels_09ddd0() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_09ddd0();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler2D arg_0_1;
-void textureNumLevels_09ddd0() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_09ddd0();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler2D arg_0_1;
-void textureNumLevels_09ddd0() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_09ddd0();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/105988.wgsl b/test/tint/builtins/gen/textureNumLevels/105988.wgsl
deleted file mode 100644
index 0014fa3..0000000
--- a/test/tint/builtins/gen/textureNumLevels/105988.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-
-// fn textureNumLevels(texture: texture_2d_array<f32>) -> i32
-fn textureNumLevels_105988() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_105988();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_105988();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_105988();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.glsl
deleted file mode 100644
index 162f265..0000000
--- a/test/tint/builtins/gen/textureNumLevels/105988.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-void textureNumLevels_105988() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_105988();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArray arg_0_1;
-void textureNumLevels_105988() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_105988();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-void textureNumLevels_105988() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_105988();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl b/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl
deleted file mode 100644
index 2dc92a3..0000000
--- a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<u32>;
-
-// fn textureNumLevels(texture: texture_1d<u32>) -> i32
-fn textureNumLevels_1e6f3b() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_1e6f3b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_1e6f3b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_1e6f3b();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.glsl
deleted file mode 100644
index 2b5dbe7..0000000
--- a/test/tint/builtins/gen/textureNumLevels/1e6f3b.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureNumLevels_1e6f3b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_1e6f3b();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler1D arg_0_1;
-void textureNumLevels_1e6f3b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_1e6f3b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler1D arg_0_1;
-void textureNumLevels_1e6f3b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_1e6f3b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl b/test/tint/builtins/gen/textureNumLevels/23f750.wgsl
deleted file mode 100644
index 20719fc..0000000
--- a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<i32>;
-
-// fn textureNumLevels(texture: texture_2d<i32>) -> i32
-fn textureNumLevels_23f750() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_23f750();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_23f750();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_23f750();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.glsl
deleted file mode 100644
index ce7bf96..0000000
--- a/test/tint/builtins/gen/textureNumLevels/23f750.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler2D arg_0_1;
-void textureNumLevels_23f750() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_23f750();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler2D arg_0_1;
-void textureNumLevels_23f750() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_23f750();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler2D arg_0_1;
-void textureNumLevels_23f750() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_23f750();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl b/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl
deleted file mode 100644
index c0db1ad..0000000
--- a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-
-// fn textureNumLevels(texture: texture_depth_cube_array) -> i32
-fn textureNumLevels_2c3575() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_2c3575();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_2c3575();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_2c3575();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.glsl
deleted file mode 100644
index 0a82078..0000000
--- a/test/tint/builtins/gen/textureNumLevels/2c3575.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLevels_2c3575() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_2c3575();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLevels_2c3575() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_2c3575();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLevels_2c3575() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_2c3575();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl b/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl
deleted file mode 100644
index d83db33..0000000
--- a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<i32>;
-
-// fn textureNumLevels(texture: texture_1d<i32>) -> i32
-fn textureNumLevels_32a0ae() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_32a0ae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_32a0ae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_32a0ae();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.glsl
deleted file mode 100644
index bf2838f..0000000
--- a/test/tint/builtins/gen/textureNumLevels/32a0ae.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureNumLevels_32a0ae() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_32a0ae();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler1D arg_0_1;
-void textureNumLevels_32a0ae() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_32a0ae();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler1D arg_0_1;
-void textureNumLevels_32a0ae() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_32a0ae();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl b/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl
deleted file mode 100644
index e9cb59f..0000000
--- a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
-
-// fn textureNumLevels(texture: texture_2d_array<u32>) -> i32
-fn textureNumLevels_5101cf() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_5101cf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_5101cf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_5101cf();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.glsl
deleted file mode 100644
index 764fd83..0000000
--- a/test/tint/builtins/gen/textureNumLevels/5101cf.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler2DArray arg_0_1;
-void textureNumLevels_5101cf() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_5101cf();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler2DArray arg_0_1;
-void textureNumLevels_5101cf() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_5101cf();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler2DArray arg_0_1;
-void textureNumLevels_5101cf() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_5101cf();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl b/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl
deleted file mode 100644
index cad2846..0000000
--- a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<f32>;
-
-// fn textureNumLevels(texture: texture_1d<f32>) -> i32
-fn textureNumLevels_51b5bb() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_51b5bb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_51b5bb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_51b5bb();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.glsl
deleted file mode 100644
index eb8b6eb..0000000
--- a/test/tint/builtins/gen/textureNumLevels/51b5bb.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureNumLevels_51b5bb() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_51b5bb();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler1D arg_0_1;
-void textureNumLevels_51b5bb() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_51b5bb();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'sampler1D' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler1D arg_0_1;
-void textureNumLevels_51b5bb() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_51b5bb();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'sampler1D' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl b/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl
deleted file mode 100644
index edf8613..0000000
--- a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-
-// fn textureNumLevels(texture: texture_cube<f32>) -> i32
-fn textureNumLevels_897aaf() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_897aaf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_897aaf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_897aaf();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.glsl
deleted file mode 100644
index a88ee82..0000000
--- a/test/tint/builtins/gen/textureNumLevels/897aaf.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCube arg_0_1;
-void textureNumLevels_897aaf() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_897aaf();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCube arg_0_1;
-void textureNumLevels_897aaf() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_897aaf();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCube arg_0_1;
-void textureNumLevels_897aaf() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_897aaf();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl b/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl
deleted file mode 100644
index 3e3a657..0000000
--- a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<i32>;
-
-// fn textureNumLevels(texture: texture_3d<i32>) -> i32
-fn textureNumLevels_9da7a5() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_9da7a5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_9da7a5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_9da7a5();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.glsl
deleted file mode 100644
index 8f3d357..0000000
--- a/test/tint/builtins/gen/textureNumLevels/9da7a5.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler3D arg_0_1;
-void textureNumLevels_9da7a5() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_9da7a5();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler3D arg_0_1;
-void textureNumLevels_9da7a5() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_9da7a5();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler3D arg_0_1;
-void textureNumLevels_9da7a5() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_9da7a5();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl b/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl
deleted file mode 100644
index 212372c..0000000
--- a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
-
-// fn textureNumLevels(texture: texture_cube_array<i32>) -> i32
-fn textureNumLevels_a91c03() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_a91c03();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_a91c03();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_a91c03();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.glsl
deleted file mode 100644
index c2ba89b..0000000
--- a/test/tint/builtins/gen/textureNumLevels/a91c03.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureNumLevels_a91c03() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_a91c03();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureNumLevels_a91c03() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_a91c03();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isamplerCubeArray arg_0_1;
-void textureNumLevels_a91c03() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_a91c03();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'isamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl b/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl
deleted file mode 100644
index a1ec36d..0000000
--- a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-
-// fn textureNumLevels(texture: texture_cube_array<f32>) -> i32
-fn textureNumLevels_aee7c8() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_aee7c8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_aee7c8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_aee7c8();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.glsl
deleted file mode 100644
index eeabadc..0000000
--- a/test/tint/builtins/gen/textureNumLevels/aee7c8.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLevels_aee7c8() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_aee7c8();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLevels_aee7c8() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_aee7c8();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_1;
-void textureNumLevels_aee7c8() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_aee7c8();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl b/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl
deleted file mode 100644
index afc20a17..0000000
--- a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-
-// fn textureNumLevels(texture: texture_depth_2d) -> i32
-fn textureNumLevels_b1b12b() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_b1b12b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_b1b12b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_b1b12b();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.glsl
deleted file mode 100644
index 8768e27..0000000
--- a/test/tint/builtins/gen/textureNumLevels/b1b12b.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2D arg_0_1;
-void textureNumLevels_b1b12b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_b1b12b();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2D arg_0_1;
-void textureNumLevels_b1b12b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_b1b12b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2D arg_0_1;
-void textureNumLevels_b1b12b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_b1b12b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl b/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl
deleted file mode 100644
index 3b2ecf5..0000000
--- a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<u32>;
-
-// fn textureNumLevels(texture: texture_3d<u32>) -> i32
-fn textureNumLevels_b4f5ea() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_b4f5ea();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_b4f5ea();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_b4f5ea();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.glsl
deleted file mode 100644
index 605253e..0000000
--- a/test/tint/builtins/gen/textureNumLevels/b4f5ea.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler3D arg_0_1;
-void textureNumLevels_b4f5ea() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_b4f5ea();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler3D arg_0_1;
-void textureNumLevels_b4f5ea() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_b4f5ea();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler3D arg_0_1;
-void textureNumLevels_b4f5ea() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_b4f5ea();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl b/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl
deleted file mode 100644
index 8386de5..0000000
--- a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
-
-// fn textureNumLevels(texture: texture_2d_array<i32>) -> i32
-fn textureNumLevels_d004a9() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_d004a9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_d004a9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_d004a9();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.glsl
deleted file mode 100644
index c111772..0000000
--- a/test/tint/builtins/gen/textureNumLevels/d004a9.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler2DArray arg_0_1;
-void textureNumLevels_d004a9() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_d004a9();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler2DArray arg_0_1;
-void textureNumLevels_d004a9() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_d004a9();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler2DArray arg_0_1;
-void textureNumLevels_d004a9() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_d004a9();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl b/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl
deleted file mode 100644
index 2b52ef0..0000000
--- a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-
-// fn textureNumLevels(texture: texture_3d<f32>) -> i32
-fn textureNumLevels_dca09e() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_dca09e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_dca09e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_dca09e();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.glsl
deleted file mode 100644
index c8d1ce0..0000000
--- a/test/tint/builtins/gen/textureNumLevels/dca09e.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler3D arg_0_1;
-void textureNumLevels_dca09e() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_dca09e();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler3D arg_0_1;
-void textureNumLevels_dca09e() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_dca09e();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler3D arg_0_1;
-void textureNumLevels_dca09e() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_dca09e();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl b/test/tint/builtins/gen/textureNumLevels/e67231.wgsl
deleted file mode 100644
index f718b8e..0000000
--- a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-
-// fn textureNumLevels(texture: texture_2d<f32>) -> i32
-fn textureNumLevels_e67231() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_e67231();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_e67231();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_e67231();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.glsl
deleted file mode 100644
index 0e6c2e9..0000000
--- a/test/tint/builtins/gen/textureNumLevels/e67231.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2D arg_0_1;
-void textureNumLevels_e67231() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_e67231();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2D arg_0_1;
-void textureNumLevels_e67231() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_e67231();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2D arg_0_1;
-void textureNumLevels_e67231() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_e67231();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl b/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl
deleted file mode 100644
index 7bd2ff2..0000000
--- a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<u32>;
-
-// fn textureNumLevels(texture: texture_cube<u32>) -> i32
-fn textureNumLevels_ed078b() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_ed078b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_ed078b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_ed078b();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.glsl
deleted file mode 100644
index 952eeac..0000000
--- a/test/tint/builtins/gen/textureNumLevels/ed078b.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usamplerCube arg_0_1;
-void textureNumLevels_ed078b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_ed078b();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usamplerCube arg_0_1;
-void textureNumLevels_ed078b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_ed078b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usamplerCube arg_0_1;
-void textureNumLevels_ed078b() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_ed078b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl b/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl
deleted file mode 100644
index 05d8294..0000000
--- a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
-
-// fn textureNumLevels(texture: texture_cube_array<u32>) -> i32
-fn textureNumLevels_f46ec6() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_f46ec6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_f46ec6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_f46ec6();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.glsl
deleted file mode 100644
index 634bfe0..0000000
--- a/test/tint/builtins/gen/textureNumLevels/f46ec6.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureNumLevels_f46ec6() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_f46ec6();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureNumLevels_f46ec6() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_f46ec6();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usamplerCubeArray arg_0_1;
-void textureNumLevels_f46ec6() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_f46ec6();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'usamplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl b/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl
deleted file mode 100644
index b608fff..0000000
--- a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-
-// fn textureNumLevels(texture: texture_depth_2d_array) -> i32
-fn textureNumLevels_f5828d() {
-  var res: i32 = textureNumLevels(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumLevels_f5828d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumLevels_f5828d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumLevels_f5828d();
-}
diff --git a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.glsl
deleted file mode 100644
index bc9ef2b..0000000
--- a/test/tint/builtins/gen/textureNumLevels/f5828d.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-void textureNumLevels_f5828d() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumLevels_f5828d();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArray arg_0_1;
-void textureNumLevels_f5828d() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumLevels_f5828d();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DArray arg_0_1;
-void textureNumLevels_f5828d() {
-  int res = textureQueryLevels(arg_0_1);
-}
-
-void compute_main() {
-  textureNumLevels_f5828d();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl b/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl
deleted file mode 100644
index 3be8ac4..0000000
--- a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
-
-// fn textureNumSamples(texture: texture_multisampled_2d<f32>) -> i32
-fn textureNumSamples_2c6f14() {
-  var res: i32 = textureNumSamples(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumSamples_2c6f14();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumSamples_2c6f14();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumSamples_2c6f14();
-}
diff --git a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.glsl
deleted file mode 100644
index 78affad..0000000
--- a/test/tint/builtins/gen/textureNumSamples/2c6f14.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DMS arg_0_1;
-void textureNumSamples_2c6f14() {
-  int res = textureSamples(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumSamples_2c6f14();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DMS arg_0_1;
-void textureNumSamples_2c6f14() {
-  int res = textureSamples(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumSamples_2c6f14();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DMS arg_0_1;
-void textureNumSamples_2c6f14() {
-  int res = textureSamples(arg_0_1);
-}
-
-void compute_main() {
-  textureNumSamples_2c6f14();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl b/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl
deleted file mode 100644
index 05af086..0000000
--- a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
-
-// fn textureNumSamples(texture: texture_multisampled_2d<u32>) -> i32
-fn textureNumSamples_42f8bb() {
-  var res: i32 = textureNumSamples(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumSamples_42f8bb();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumSamples_42f8bb();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumSamples_42f8bb();
-}
diff --git a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.glsl
deleted file mode 100644
index 5860006..0000000
--- a/test/tint/builtins/gen/textureNumSamples/42f8bb.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp usampler2DMS arg_0_1;
-void textureNumSamples_42f8bb() {
-  int res = textureSamples(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumSamples_42f8bb();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp usampler2DMS arg_0_1;
-void textureNumSamples_42f8bb() {
-  int res = textureSamples(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumSamples_42f8bb();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp usampler2DMS arg_0_1;
-void textureNumSamples_42f8bb() {
-  int res = textureSamples(arg_0_1);
-}
-
-void compute_main() {
-  textureNumSamples_42f8bb();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl b/test/tint/builtins/gen/textureNumSamples/449d23.wgsl
deleted file mode 100644
index d0f5b5c..0000000
--- a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
-
-// fn textureNumSamples(texture: texture_multisampled_2d<i32>) -> i32
-fn textureNumSamples_449d23() {
-  var res: i32 = textureNumSamples(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumSamples_449d23();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumSamples_449d23();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumSamples_449d23();
-}
diff --git a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.glsl
deleted file mode 100644
index 84bf1dc..0000000
--- a/test/tint/builtins/gen/textureNumSamples/449d23.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp isampler2DMS arg_0_1;
-void textureNumSamples_449d23() {
-  int res = textureSamples(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumSamples_449d23();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp isampler2DMS arg_0_1;
-void textureNumSamples_449d23() {
-  int res = textureSamples(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumSamples_449d23();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp isampler2DMS arg_0_1;
-void textureNumSamples_449d23() {
-  int res = textureSamples(arg_0_1);
-}
-
-void compute_main() {
-  textureNumSamples_449d23();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl b/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl
deleted file mode 100644
index 3599955..0000000
--- a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
-
-// fn textureNumSamples(texture: texture_depth_multisampled_2d) -> i32
-fn textureNumSamples_a3c8a0() {
-  var res: i32 = textureNumSamples(arg_0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureNumSamples_a3c8a0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureNumSamples_a3c8a0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureNumSamples_a3c8a0();
-}
diff --git a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.glsl b/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.glsl
deleted file mode 100644
index 03bd8d5..0000000
--- a/test/tint/builtins/gen/textureNumSamples/a3c8a0.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DMS arg_0_1;
-void textureNumSamples_a3c8a0() {
-  int res = textureSamples(arg_0_1);
-}
-
-vec4 vertex_main() {
-  textureNumSamples_a3c8a0();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DMS arg_0_1;
-void textureNumSamples_a3c8a0() {
-  int res = textureSamples(arg_0_1);
-}
-
-void fragment_main() {
-  textureNumSamples_a3c8a0();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:6: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DMS arg_0_1;
-void textureNumSamples_a3c8a0() {
-  int res = textureSamples(arg_0_1);
-}
-
-void compute_main() {
-  textureNumSamples_a3c8a0();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: 'textureSamples' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSample/02aa9b.wgsl b/test/tint/builtins/gen/textureSample/02aa9b.wgsl
deleted file mode 100644
index e392604..0000000
--- a/test/tint/builtins/gen/textureSample/02aa9b.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
-fn textureSample_02aa9b() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_02aa9b();
-}
diff --git a/test/tint/builtins/gen/textureSample/100dc0.wgsl b/test/tint/builtins/gen/textureSample/100dc0.wgsl
deleted file mode 100644
index 89ecf17..0000000
--- a/test/tint/builtins/gen/textureSample/100dc0.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, offset: vec3<i32>) -> vec4<f32>
-fn textureSample_100dc0() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), vec3<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_100dc0();
-}
diff --git a/test/tint/builtins/gen/textureSample/38bbb9.wgsl b/test/tint/builtins/gen/textureSample/38bbb9.wgsl
deleted file mode 100644
index 3174564..0000000
--- a/test/tint/builtins/gen/textureSample/38bbb9.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> f32
-fn textureSample_38bbb9() {
-  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_38bbb9();
-}
diff --git a/test/tint/builtins/gen/textureSample/3b50bd.wgsl b/test/tint/builtins/gen/textureSample/3b50bd.wgsl
deleted file mode 100644
index f0ee1c5..0000000
--- a/test/tint/builtins/gen/textureSample/3b50bd.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-fn textureSample_3b50bd() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_3b50bd();
-}
diff --git a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl b/test/tint/builtins/gen/textureSample/4dd1bf.wgsl
deleted file mode 100644
index 508775a..0000000
--- a/test/tint/builtins/gen/textureSample/4dd1bf.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
-fn textureSample_4dd1bf() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_4dd1bf();
-}
diff --git a/test/tint/builtins/gen/textureSample/51b514.wgsl b/test/tint/builtins/gen/textureSample/51b514.wgsl
deleted file mode 100644
index 47f972c..0000000
--- a/test/tint/builtins/gen/textureSample/51b514.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureSample_51b514() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_51b514();
-}
diff --git a/test/tint/builtins/gen/textureSample/667d76.wgsl b/test/tint/builtins/gen/textureSample/667d76.wgsl
deleted file mode 100644
index f4d62dd..0000000
--- a/test/tint/builtins/gen/textureSample/667d76.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> f32
-fn textureSample_667d76() {
-  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_667d76();
-}
diff --git a/test/tint/builtins/gen/textureSample/6717ca.wgsl b/test/tint/builtins/gen/textureSample/6717ca.wgsl
deleted file mode 100644
index 4180ea0..0000000
--- a/test/tint/builtins/gen/textureSample/6717ca.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
-fn textureSample_6717ca() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_6717ca();
-}
diff --git a/test/tint/builtins/gen/textureSample/6e64fb.wgsl b/test/tint/builtins/gen/textureSample/6e64fb.wgsl
deleted file mode 100644
index 92ec855..0000000
--- a/test/tint/builtins/gen/textureSample/6e64fb.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_1d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_1d<f32>, sampler: sampler, coords: f32) -> vec4<f32>
-fn textureSample_6e64fb() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_6e64fb();
-}
diff --git a/test/tint/builtins/gen/textureSample/7c3baa.wgsl b/test/tint/builtins/gen/textureSample/7c3baa.wgsl
deleted file mode 100644
index 14d09e4..0000000
--- a/test/tint/builtins/gen/textureSample/7c3baa.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
-fn textureSample_7c3baa() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_7c3baa();
-}
diff --git a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl b/test/tint/builtins/gen/textureSample/7e9ffd.wgsl
deleted file mode 100644
index 15c221c..0000000
--- a/test/tint/builtins/gen/textureSample/7e9ffd.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32) -> f32
-fn textureSample_7e9ffd() {
-  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_7e9ffd();
-}
diff --git a/test/tint/builtins/gen/textureSample/8522e7.wgsl b/test/tint/builtins/gen/textureSample/8522e7.wgsl
deleted file mode 100644
index d82c289..0000000
--- a/test/tint/builtins/gen/textureSample/8522e7.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> f32
-fn textureSample_8522e7() {
-  var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_8522e7();
-}
diff --git a/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.glsl b/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.glsl
deleted file mode 100644
index 762475e..0000000
--- a/test/tint/builtins/gen/textureSample/8522e7.wgsl.expected.glsl
+++ /dev/null
@@ -1,26 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSample_8522e7() {
-  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), ivec2(0, 0));
-}
-
-void fragment_main() {
-  textureSample_8522e7();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:7: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
-ERROR: 0:7: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl b/test/tint/builtins/gen/textureSample/c2f4e8.wgsl
deleted file mode 100644
index b577d22..0000000
--- a/test/tint/builtins/gen/textureSample/c2f4e8.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> f32
-fn textureSample_c2f4e8() {
-  var res: f32 = textureSample(arg_0, arg_1, vec3<f32>(), 1);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_c2f4e8();
-}
diff --git a/test/tint/builtins/gen/textureSample/e53267.wgsl b/test/tint/builtins/gen/textureSample/e53267.wgsl
deleted file mode 100644
index 39add13..0000000
--- a/test/tint/builtins/gen/textureSample/e53267.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-fn textureSample_e53267() {
-  var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_e53267();
-}
diff --git a/test/tint/builtins/gen/textureSample/ea7030.wgsl b/test/tint/builtins/gen/textureSample/ea7030.wgsl
deleted file mode 100644
index ebd9e50..0000000
--- a/test/tint/builtins/gen/textureSample/ea7030.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32
-fn textureSample_ea7030() {
-  var res: f32 = textureSample(arg_0, arg_1, vec3<f32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSample_ea7030();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl b/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl
deleted file mode 100644
index 18c60e7..0000000
--- a/test/tint/builtins/gen/textureSampleBias/53b9f7.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
-fn textureSampleBias_53b9f7() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_53b9f7();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl b/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl
deleted file mode 100644
index 4261567..0000000
--- a/test/tint/builtins/gen/textureSampleBias/65ac50.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, bias: f32, offset: vec2<i32>) -> vec4<f32>
-fn textureSampleBias_65ac50() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_65ac50();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl b/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl
deleted file mode 100644
index 8366a13..0000000
--- a/test/tint/builtins/gen/textureSampleBias/6a9113.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32) -> vec4<f32>
-fn textureSampleBias_6a9113() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_6a9113();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl b/test/tint/builtins/gen/textureSampleBias/80e579.wgsl
deleted file mode 100644
index bdf6621..0000000
--- a/test/tint/builtins/gen/textureSampleBias/80e579.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, bias: f32) -> vec4<f32>
-fn textureSampleBias_80e579() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_80e579();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl b/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl
deleted file mode 100644
index 1404fe9..0000000
--- a/test/tint/builtins/gen/textureSampleBias/81c19a.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32, offset: vec2<i32>) -> vec4<f32>
-fn textureSampleBias_81c19a() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_81c19a();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl b/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl
deleted file mode 100644
index c35677c..0000000
--- a/test/tint/builtins/gen/textureSampleBias/d3fa1b.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
-fn textureSampleBias_d3fa1b() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_d3fa1b();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl b/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl
deleted file mode 100644
index 0232d0a..0000000
--- a/test/tint/builtins/gen/textureSampleBias/df91bb.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32, offset: vec3<i32>) -> vec4<f32>
-fn textureSampleBias_df91bb() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_df91bb();
-}
diff --git a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl b/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl
deleted file mode 100644
index bbc1ad7..0000000
--- a/test/tint/builtins/gen/textureSampleBias/eed7c4.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleBias(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, bias: f32) -> vec4<f32>
-fn textureSampleBias_eed7c4() {
-  var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1, 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleBias_eed7c4();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl b/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl
deleted file mode 100644
index a5b4803..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/25fcd1.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> f32
-fn textureSampleCompare_25fcd1() {
-  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompare_25fcd1();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl b/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl
deleted file mode 100644
index 7c8fda5..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/3a5923.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
-fn textureSampleCompare_3a5923() {
-  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompare_3a5923();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl b/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl
deleted file mode 100644
index 163731a..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/63fb83.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
-fn textureSampleCompare_63fb83() {
-  var res: f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompare_63fb83();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl b/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl
deleted file mode 100644
index a21c6e9..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> f32
-fn textureSampleCompare_98b85c() {
-  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompare_98b85c();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.glsl
deleted file mode 100644
index 0064717..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/98b85c.wgsl.expected.glsl
+++ /dev/null
@@ -1,26 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleCompare_98b85c() {
-  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0, 0));
-}
-
-void fragment_main() {
-  textureSampleCompare_98b85c();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:7: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
-ERROR: 0:7: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl b/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl
deleted file mode 100644
index 24aa9b5..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/a3ca7e.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompare(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> f32
-fn textureSampleCompare_a3ca7e() {
-  var res: f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompare_a3ca7e();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl b/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl
deleted file mode 100644
index 53015a4..0000000
--- a/test/tint/builtins/gen/textureSampleCompare/dd431d.wgsl
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> f32
-fn textureSampleCompare_dd431d() {
-  var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompare_dd431d();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl b/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl
deleted file mode 100644
index a6fa885..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompareLevel(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> f32
-fn textureSampleCompareLevel_011a8f() {
-  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleCompareLevel_011a8f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompareLevel_011a8f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleCompareLevel_011a8f();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.glsl
deleted file mode 100644
index 6bc5a40..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/011a8f.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleCompareLevel_011a8f() {
-  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0, 0));
-}
-
-vec4 vertex_main() {
-  textureSampleCompareLevel_011a8f();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleCompareLevel_011a8f() {
-  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0, 0));
-}
-
-void fragment_main() {
-  textureSampleCompareLevel_011a8f();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:7: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
-ERROR: 0:7: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleCompareLevel_011a8f() {
-  float res = textureOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 1.0f), ivec2(0, 0));
-}
-
-void compute_main() {
-  textureSampleCompareLevel_011a8f();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'sampler' : TextureOffset does not support sampler2DArrayShadow :  ES Profile
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl b/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl
deleted file mode 100644
index 126cedc..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/1116ed.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompareLevel(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> f32
-fn textureSampleCompareLevel_1116ed() {
-  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleCompareLevel_1116ed();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompareLevel_1116ed();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleCompareLevel_1116ed();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl b/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl
deleted file mode 100644
index 1525450..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/1568e3.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompareLevel(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
-fn textureSampleCompareLevel_1568e3() {
-  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleCompareLevel_1568e3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompareLevel_1568e3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleCompareLevel_1568e3();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl b/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl
deleted file mode 100644
index b03768d..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/2ad2b1.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
-fn textureSampleCompareLevel_2ad2b1() {
-  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleCompareLevel_2ad2b1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompareLevel_2ad2b1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleCompareLevel_2ad2b1();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl b/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl
deleted file mode 100644
index 46931cb..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompareLevel(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> f32
-fn textureSampleCompareLevel_4cf3a2() {
-  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleCompareLevel_4cf3a2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompareLevel_4cf3a2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleCompareLevel_4cf3a2();
-}
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.glsl
deleted file mode 100644
index bdb0e8c..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureSampleCompareLevel_4cf3a2() {
-  float res = texture(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-vec4 vertex_main() {
-  textureSampleCompareLevel_4cf3a2();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureSampleCompareLevel_4cf3a2() {
-  float res = texture(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-void fragment_main() {
-  textureSampleCompareLevel_4cf3a2();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureSampleCompareLevel_4cf3a2() {
-  float res = texture(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-void compute_main() {
-  textureSampleCompareLevel_4cf3a2();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl b/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl
deleted file mode 100644
index 50fbbe1..0000000
--- a/test/tint/builtins/gen/textureSampleCompareLevel/f8121c.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler_comparison;
-
-// fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> f32
-fn textureSampleCompareLevel_f8121c() {
-  var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleCompareLevel_f8121c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleCompareLevel_f8121c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleCompareLevel_f8121c();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl b/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl
deleted file mode 100644
index ca02cee..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/21402b.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
-fn textureSampleGrad_21402b() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_21402b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_21402b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_21402b();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl b/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl
deleted file mode 100644
index b68b12e..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/2ecd8f.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
-fn textureSampleGrad_2ecd8f() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_2ecd8f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_2ecd8f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_2ecd8f();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl b/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl
deleted file mode 100644
index a15d544..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/468f88.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
-fn textureSampleGrad_468f88() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_468f88();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_468f88();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_468f88();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl b/test/tint/builtins/gen/textureSampleGrad/521263.wgsl
deleted file mode 100644
index 3794685..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/521263.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
-fn textureSampleGrad_521263() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_521263();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_521263();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_521263();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl b/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl
deleted file mode 100644
index 03e7930..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/5312f4.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
-fn textureSampleGrad_5312f4() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_5312f4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_5312f4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_5312f4();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl b/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl
deleted file mode 100644
index 13fa737..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/872f00.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, ddx: vec2<f32>, ddy: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
-fn textureSampleGrad_872f00() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>(), vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_872f00();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_872f00();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_872f00();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl b/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl
deleted file mode 100644
index 4e2e62a..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
-fn textureSampleGrad_e383db() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), 1, vec3<f32>(), vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_e383db();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_e383db();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_e383db();
-}
diff --git a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.glsl
deleted file mode 100644
index f553210..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/e383db.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_arg_1;
-
-void textureSampleGrad_e383db() {
-  vec4 res = textureGrad(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureSampleGrad_e383db();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_arg_1;
-
-void textureSampleGrad_e383db() {
-  vec4 res = textureGrad(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureSampleGrad_e383db();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_arg_1;
-
-void textureSampleGrad_e383db() {
-  vec4 res = textureGrad(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureSampleGrad_e383db();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl b/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl
deleted file mode 100644
index 0b0c659..0000000
--- a/test/tint/builtins/gen/textureSampleGrad/e9a2f7.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>, offset: vec3<i32>) -> vec4<f32>
-fn textureSampleGrad_e9a2f7() {
-  var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>(), vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleGrad_e9a2f7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleGrad_e9a2f7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleGrad_e9a2f7();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl b/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl
deleted file mode 100644
index 6bce2c6..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/02be59.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: i32) -> f32
-fn textureSampleLevel_02be59() {
-  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_02be59();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_02be59();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_02be59();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl b/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl
deleted file mode 100644
index f4b34fe..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, level: f32) -> vec4<f32>
-fn textureSampleLevel_0bdd9a() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_0bdd9a();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_0bdd9a();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_0bdd9a();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.glsl
deleted file mode 100644
index 60ebf4e..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/0bdd9a.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_arg_1;
-
-void textureSampleLevel_0bdd9a() {
-  vec4 res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-vec4 vertex_main() {
-  textureSampleLevel_0bdd9a();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArray arg_0_arg_1;
-
-void textureSampleLevel_0bdd9a() {
-  vec4 res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-void fragment_main() {
-  textureSampleLevel_0bdd9a();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArray arg_0_arg_1;
-
-void textureSampleLevel_0bdd9a() {
-  vec4 res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), 1.0f);
-}
-
-void compute_main() {
-  textureSampleLevel_0bdd9a();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArray' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl b/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl
deleted file mode 100644
index 307442c..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: i32) -> f32
-fn textureSampleLevel_1b0291() {
-  var res: f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_1b0291();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_1b0291();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_1b0291();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.glsl
deleted file mode 100644
index c410e7c..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/1b0291.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeShadow arg_0_arg_1;
-
-void textureSampleLevel_1b0291() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, 0.0f), float(0));
-}
-
-vec4 vertex_main() {
-  textureSampleLevel_1b0291();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureLod' : no matching overloaded function found 
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeShadow arg_0_arg_1;
-
-void textureSampleLevel_1b0291() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, 0.0f), float(0));
-}
-
-void fragment_main() {
-  textureSampleLevel_1b0291();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:7: 'textureLod' : no matching overloaded function found 
-ERROR: 0:7: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeShadow arg_0_arg_1;
-
-void textureSampleLevel_1b0291() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, 0.0f), float(0));
-}
-
-void compute_main() {
-  textureSampleLevel_1b0291();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureLod' : no matching overloaded function found 
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl b/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl
deleted file mode 100644
index b32ce00..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, level: i32) -> f32
-fn textureSampleLevel_1bf73e() {
-  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_1bf73e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_1bf73e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_1bf73e();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.glsl
deleted file mode 100644
index defb6f6..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/1bf73e.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_1bf73e() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0));
-}
-
-vec4 vertex_main() {
-  textureSampleLevel_1bf73e();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureLod' : no matching overloaded function found 
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_1bf73e() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0));
-}
-
-void fragment_main() {
-  textureSampleLevel_1bf73e();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:7: 'textureLod' : no matching overloaded function found 
-ERROR: 0:7: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_1bf73e() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0));
-}
-
-void compute_main() {
-  textureSampleLevel_1bf73e();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureLod' : no matching overloaded function found 
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl b/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl
deleted file mode 100644
index fb1df7c..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/302be4.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, level: f32) -> vec4<f32>
-fn textureSampleLevel_302be4() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_302be4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_302be4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_302be4();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl b/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl
deleted file mode 100644
index b7d0ced..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/47daa4.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: i32, offset: vec2<i32>) -> f32
-fn textureSampleLevel_47daa4() {
-  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_47daa4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_47daa4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_47daa4();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl b/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl
deleted file mode 100644
index 4d3d865..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/690d95.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32, offset: vec2<i32>) -> vec4<f32>
-fn textureSampleLevel_690d95() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_690d95();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_690d95();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_690d95();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl b/test/tint/builtins/gen/textureSampleLevel/979816.wgsl
deleted file mode 100644
index 17345bb..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_external;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureSampleLevel_979816() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_979816();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_979816();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_979816();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl
deleted file mode 100644
index 0685239..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl
+++ /dev/null
@@ -1,174 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-};
-
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-} ext_tex_params;
-
-
-vec4 textureSampleExternal(highp sampler2D plane0_smp, highp sampler2D plane1_smp, vec2 coord, ExternalTextureParams params) {
-  if ((params.numPlanes == 1u)) {
-    return textureLod(plane0_smp, coord, 0.0f);
-  }
-  float y = (textureLod(plane0_smp, coord, 0.0f).r - 0.0625f);
-  vec2 uv = (textureLod(plane1_smp, coord, 0.0f).rg - 0.5f);
-  float u = uv.x;
-  float v = uv.y;
-  float r = ((1.164000034f * y) + (params.vr * v));
-  float g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
-  float b = ((1.164000034f * y) + (params.ub * u));
-  return vec4(r, g, b, 1.0f);
-}
-
-uniform highp sampler2D arg_0_arg_1;
-uniform highp sampler2D ext_tex_plane_1_arg_1;
-void textureSampleLevel_979816() {
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f, 0.0f), ext_tex_params);
-}
-
-vec4 vertex_main() {
-  textureSampleLevel_979816();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:37: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-};
-
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-} ext_tex_params;
-
-
-vec4 textureSampleExternal(highp sampler2D plane0_smp, highp sampler2D plane1_smp, vec2 coord, ExternalTextureParams params) {
-  if ((params.numPlanes == 1u)) {
-    return textureLod(plane0_smp, coord, 0.0f);
-  }
-  float y = (textureLod(plane0_smp, coord, 0.0f).r - 0.0625f);
-  vec2 uv = (textureLod(plane1_smp, coord, 0.0f).rg - 0.5f);
-  float u = uv.x;
-  float v = uv.y;
-  float r = ((1.164000034f * y) + (params.vr * v));
-  float g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
-  float b = ((1.164000034f * y) + (params.ub * u));
-  return vec4(r, g, b, 1.0f);
-}
-
-uniform highp sampler2D arg_0_arg_1;
-uniform highp sampler2D ext_tex_plane_1_arg_1;
-void textureSampleLevel_979816() {
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f, 0.0f), ext_tex_params);
-}
-
-void fragment_main() {
-  textureSampleLevel_979816();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:38: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:38: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:38: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-struct ExternalTextureParams {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-};
-
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  float vr;
-  float ug;
-  float vg;
-  float ub;
-} ext_tex_params;
-
-
-vec4 textureSampleExternal(highp sampler2D plane0_smp, highp sampler2D plane1_smp, vec2 coord, ExternalTextureParams params) {
-  if ((params.numPlanes == 1u)) {
-    return textureLod(plane0_smp, coord, 0.0f);
-  }
-  float y = (textureLod(plane0_smp, coord, 0.0f).r - 0.0625f);
-  vec2 uv = (textureLod(plane1_smp, coord, 0.0f).rg - 0.5f);
-  float u = uv.x;
-  float v = uv.y;
-  float r = ((1.164000034f * y) + (params.vr * v));
-  float g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
-  float b = ((1.164000034f * y) + (params.ub * u));
-  return vec4(r, g, b, 1.0f);
-}
-
-uniform highp sampler2D arg_0_arg_1;
-uniform highp sampler2D ext_tex_plane_1_arg_1;
-void textureSampleLevel_979816() {
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f, 0.0f), ext_tex_params);
-}
-
-void compute_main() {
-  textureSampleLevel_979816();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:37: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl b/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl
deleted file mode 100644
index 6620b31..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/9bd37b.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32, offset: vec3<i32>) -> vec4<f32>
-fn textureSampleLevel_9bd37b() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_9bd37b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_9bd37b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_9bd37b();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl b/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl
deleted file mode 100644
index dc7ae8c..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/a4af26.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, level: f32, offset: vec2<i32>) -> vec4<f32>
-fn textureSampleLevel_a4af26() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_a4af26();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_a4af26();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_a4af26();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl b/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl
deleted file mode 100644
index 1ee0d7a..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/abfcc0.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_3d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
-fn textureSampleLevel_abfcc0() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_abfcc0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_abfcc0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_abfcc0();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl b/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl
deleted file mode 100644
index b5a1323..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_cube_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32, level: i32) -> f32
-fn textureSampleLevel_ae5e39() {
-  var res: f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_ae5e39();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_ae5e39();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_ae5e39();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.glsl
deleted file mode 100644
index 93e68a6..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/ae5e39.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_ae5e39() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), float(0));
-}
-
-vec4 vertex_main() {
-  textureSampleLevel_ae5e39();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_ae5e39() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), float(0));
-}
-
-void fragment_main() {
-  textureSampleLevel_ae5e39();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp samplerCubeArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_ae5e39() {
-  float res = textureLod(arg_0_arg_1, vec4(0.0f, 0.0f, 0.0f, float(1)), float(0));
-}
-
-void compute_main() {
-  textureSampleLevel_ae5e39();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'samplerCubeArrayShadow' : Reserved word. 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl b/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl
deleted file mode 100644
index 6c4178e..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_depth_2d_array;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, level: i32, offset: vec2<i32>) -> f32
-fn textureSampleLevel_ba93b3() {
-  var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0, vec2<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_ba93b3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_ba93b3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_ba93b3();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.glsl
deleted file mode 100644
index 2cc11f5..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/ba93b3.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_ba93b3() {
-  float res = textureLodOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0), ivec2(0, 0));
-}
-
-vec4 vertex_main() {
-  textureSampleLevel_ba93b3();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureLodOffset' : no matching overloaded function found 
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_ba93b3() {
-  float res = textureLodOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0), ivec2(0, 0));
-}
-
-void fragment_main() {
-  textureSampleLevel_ba93b3();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:7: 'textureLodOffset' : no matching overloaded function found 
-ERROR: 0:7: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-uniform highp sampler2DArrayShadow arg_0_arg_1;
-
-void textureSampleLevel_ba93b3() {
-  float res = textureLodOffset(arg_0_arg_1, vec4(0.0f, 0.0f, float(1), 0.0f), float(0), ivec2(0, 0));
-}
-
-void compute_main() {
-  textureSampleLevel_ba93b3();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:6: 'textureLodOffset' : no matching overloaded function found 
-ERROR: 0:6: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl b/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl
deleted file mode 100644
index 16ef52b..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/c32df7.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_cube<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
-fn textureSampleLevel_c32df7() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_c32df7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_c32df7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_c32df7();
-}
diff --git a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl b/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl
deleted file mode 100644
index 8a5a47f..0000000
--- a/test/tint/builtins/gen/textureSampleLevel/c6aca6.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_2d<f32>;
-@group(1) @binding(1) var arg_1: sampler;
-
-// fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32) -> vec4<f32>
-fn textureSampleLevel_c6aca6() {
-  var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureSampleLevel_c6aca6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureSampleLevel_c6aca6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureSampleLevel_c6aca6();
-}
diff --git a/test/tint/builtins/gen/textureStore/05ce15.wgsl b/test/tint/builtins/gen/textureStore/05ce15.wgsl
deleted file mode 100644
index 88fb6bd..0000000
--- a/test/tint/builtins/gen/textureStore/05ce15.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba32float, write>, coords: vec2<i32>, value: vec4<f32>)
-fn textureStore_05ce15() {
-  textureStore(arg_0, vec2<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_05ce15();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_05ce15();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_05ce15();
-}
diff --git a/test/tint/builtins/gen/textureStore/064c7f.wgsl b/test/tint/builtins/gen/textureStore/064c7f.wgsl
deleted file mode 100644
index 411a952..0000000
--- a/test/tint/builtins/gen/textureStore/064c7f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
-
-// fn textureStore(texture: texture_storage_2d<rg32float, write>, coords: vec2<i32>, value: vec4<f32>)
-fn textureStore_064c7f() {
-  textureStore(arg_0, vec2<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_064c7f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_064c7f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_064c7f();
-}
diff --git a/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.glsl
deleted file mode 100644
index 911c394..0000000
--- a/test/tint/builtins/gen/textureStore/064c7f.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2D arg_0;
-void textureStore_064c7f() {
-  imageStore(arg_0, ivec2(0, 0), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_064c7f();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image2D arg_0;
-void textureStore_064c7f() {
-  imageStore(arg_0, ivec2(0, 0), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_064c7f();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2D arg_0;
-void textureStore_064c7f() {
-  imageStore(arg_0, ivec2(0, 0), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_064c7f();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/068641.wgsl b/test/tint/builtins/gen/textureStore/068641.wgsl
deleted file mode 100644
index b8b50f4..0000000
--- a/test/tint/builtins/gen/textureStore/068641.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba16uint, write>, coords: vec3<i32>, value: vec4<u32>)
-fn textureStore_068641() {
-  textureStore(arg_0, vec3<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_068641();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_068641();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_068641();
-}
diff --git a/test/tint/builtins/gen/textureStore/0af6b5.wgsl b/test/tint/builtins/gen/textureStore/0af6b5.wgsl
deleted file mode 100644
index d58fe96..0000000
--- a/test/tint/builtins/gen/textureStore/0af6b5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
-
-// fn textureStore(texture: texture_storage_2d<r32float, write>, coords: vec2<i32>, value: vec4<f32>)
-fn textureStore_0af6b5() {
-  textureStore(arg_0, vec2<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_0af6b5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_0af6b5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_0af6b5();
-}
diff --git a/test/tint/builtins/gen/textureStore/0c3dff.wgsl b/test/tint/builtins/gen/textureStore/0c3dff.wgsl
deleted file mode 100644
index 6320997..0000000
--- a/test/tint/builtins/gen/textureStore/0c3dff.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba16uint, write>, coords: vec2<i32>, value: vec4<u32>)
-fn textureStore_0c3dff() {
-  textureStore(arg_0, vec2<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_0c3dff();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_0c3dff();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_0c3dff();
-}
diff --git a/test/tint/builtins/gen/textureStore/102722.wgsl b/test/tint/builtins/gen/textureStore/102722.wgsl
deleted file mode 100644
index 8455118..0000000
--- a/test/tint/builtins/gen/textureStore/102722.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
-
-// fn textureStore(texture: texture_storage_1d<r32uint, write>, coords: i32, value: vec4<u32>)
-fn textureStore_102722() {
-  textureStore(arg_0, 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_102722();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_102722();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_102722();
-}
diff --git a/test/tint/builtins/gen/textureStore/102722.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/102722.wgsl.expected.glsl
deleted file mode 100644
index cf61c8d..0000000
--- a/test/tint/builtins/gen/textureStore/102722.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(r32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_102722() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_102722();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(r32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_102722() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_102722();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(r32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_102722() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_102722();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/1bbd08.wgsl b/test/tint/builtins/gen/textureStore/1bbd08.wgsl
deleted file mode 100644
index 2537d61..0000000
--- a/test/tint/builtins/gen/textureStore/1bbd08.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba8unorm, write>, coords: vec3<i32>, value: vec4<f32>)
-fn textureStore_1bbd08() {
-  textureStore(arg_0, vec3<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_1bbd08();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_1bbd08();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_1bbd08();
-}
diff --git a/test/tint/builtins/gen/textureStore/1c02e7.wgsl b/test/tint/builtins/gen/textureStore/1c02e7.wgsl
deleted file mode 100644
index c1dc414..0000000
--- a/test/tint/builtins/gen/textureStore/1c02e7.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<r32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
-fn textureStore_1c02e7() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_1c02e7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_1c02e7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_1c02e7();
-}
diff --git a/test/tint/builtins/gen/textureStore/22d955.wgsl b/test/tint/builtins/gen/textureStore/22d955.wgsl
deleted file mode 100644
index fd3f3ce..0000000
--- a/test/tint/builtins/gen/textureStore/22d955.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba8uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
-fn textureStore_22d955() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_22d955();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_22d955();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_22d955();
-}
diff --git a/test/tint/builtins/gen/textureStore/26bf70.wgsl b/test/tint/builtins/gen/textureStore/26bf70.wgsl
deleted file mode 100644
index 1610dec..0000000
--- a/test/tint/builtins/gen/textureStore/26bf70.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba32uint, write>, coords: vec2<i32>, value: vec4<u32>)
-fn textureStore_26bf70() {
-  textureStore(arg_0, vec2<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_26bf70();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_26bf70();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_26bf70();
-}
diff --git a/test/tint/builtins/gen/textureStore/2796b4.wgsl b/test/tint/builtins/gen/textureStore/2796b4.wgsl
deleted file mode 100644
index f8376a7..0000000
--- a/test/tint/builtins/gen/textureStore/2796b4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rg32sint, write>, coords: vec3<i32>, value: vec4<i32>)
-fn textureStore_2796b4() {
-  textureStore(arg_0, vec3<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_2796b4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_2796b4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_2796b4();
-}
diff --git a/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.glsl
deleted file mode 100644
index 6a9ddd4..0000000
--- a/test/tint/builtins/gen/textureStore/2796b4.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage3D arg_0;
-void textureStore_2796b4() {
-  imageStore(arg_0, ivec3(0, 0, 0), ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_2796b4();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage3D arg_0;
-void textureStore_2796b4() {
-  imageStore(arg_0, ivec3(0, 0, 0), ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_2796b4();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage3D arg_0;
-void textureStore_2796b4() {
-  imageStore(arg_0, ivec3(0, 0, 0), ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_2796b4();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl b/test/tint/builtins/gen/textureStore/2ac6c7.wgsl
deleted file mode 100644
index 030b84b..0000000
--- a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
-
-// fn textureStore(texture: texture_storage_1d<r32float, write>, coords: i32, value: vec4<f32>)
-fn textureStore_2ac6c7() {
-  textureStore(arg_0, 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_2ac6c7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_2ac6c7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_2ac6c7();
-}
diff --git a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.glsl
deleted file mode 100644
index 4ae2c89..0000000
--- a/test/tint/builtins/gen/textureStore/2ac6c7.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(r32f) uniform highp writeonly image1D arg_0;
-void textureStore_2ac6c7() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_2ac6c7();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(r32f) uniform highp writeonly image1D arg_0;
-void textureStore_2ac6c7() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_2ac6c7();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(r32f) uniform highp writeonly image1D arg_0;
-void textureStore_2ac6c7() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_2ac6c7();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl b/test/tint/builtins/gen/textureStore/2eb2a4.wgsl
deleted file mode 100644
index 56d3c73..0000000
--- a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba16uint, write>, coords: i32, value: vec4<u32>)
-fn textureStore_2eb2a4() {
-  textureStore(arg_0, 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_2eb2a4();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_2eb2a4();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_2eb2a4();
-}
diff --git a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.glsl
deleted file mode 100644
index fb38590..0000000
--- a/test/tint/builtins/gen/textureStore/2eb2a4.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_2eb2a4() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_2eb2a4();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_2eb2a4() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_2eb2a4();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba16ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_2eb2a4() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_2eb2a4();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl b/test/tint/builtins/gen/textureStore/2ed2a3.wgsl
deleted file mode 100644
index f86ec1f..0000000
--- a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba8snorm, write>, coords: i32, value: vec4<f32>)
-fn textureStore_2ed2a3() {
-  textureStore(arg_0, 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_2ed2a3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_2ed2a3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_2ed2a3();
-}
diff --git a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.glsl
deleted file mode 100644
index a6aa8e7..0000000
--- a/test/tint/builtins/gen/textureStore/2ed2a3.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
-void textureStore_2ed2a3() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_2ed2a3();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
-void textureStore_2ed2a3() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_2ed2a3();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8_snorm) uniform highp writeonly image1D arg_0;
-void textureStore_2ed2a3() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_2ed2a3();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/31745b.wgsl b/test/tint/builtins/gen/textureStore/31745b.wgsl
deleted file mode 100644
index 41125fe..0000000
--- a/test/tint/builtins/gen/textureStore/31745b.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rg32sint, write>, coords: vec2<i32>, value: vec4<i32>)
-fn textureStore_31745b() {
-  textureStore(arg_0, vec2<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_31745b();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_31745b();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_31745b();
-}
diff --git a/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.glsl
deleted file mode 100644
index 58f502f..0000000
--- a/test/tint/builtins/gen/textureStore/31745b.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2D arg_0;
-void textureStore_31745b() {
-  imageStore(arg_0, ivec2(0, 0), ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_31745b();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage2D arg_0;
-void textureStore_31745b() {
-  imageStore(arg_0, ivec2(0, 0), ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_31745b();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2D arg_0;
-void textureStore_31745b() {
-  imageStore(arg_0, ivec2(0, 0), ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_31745b();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/32f368.wgsl b/test/tint/builtins/gen/textureStore/32f368.wgsl
deleted file mode 100644
index 5b2aa6b..0000000
--- a/test/tint/builtins/gen/textureStore/32f368.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba16float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
-fn textureStore_32f368() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_32f368();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_32f368();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_32f368();
-}
diff --git a/test/tint/builtins/gen/textureStore/331aee.wgsl b/test/tint/builtins/gen/textureStore/331aee.wgsl
deleted file mode 100644
index 115b0b0..0000000
--- a/test/tint/builtins/gen/textureStore/331aee.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba32float, write>, coords: vec3<i32>, value: vec4<f32>)
-fn textureStore_331aee() {
-  textureStore(arg_0, vec3<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_331aee();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_331aee();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_331aee();
-}
diff --git a/test/tint/builtins/gen/textureStore/38e8d7.wgsl b/test/tint/builtins/gen/textureStore/38e8d7.wgsl
deleted file mode 100644
index e8fc960..0000000
--- a/test/tint/builtins/gen/textureStore/38e8d7.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<r32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
-fn textureStore_38e8d7() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_38e8d7();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_38e8d7();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_38e8d7();
-}
diff --git a/test/tint/builtins/gen/textureStore/3a52ac.wgsl b/test/tint/builtins/gen/textureStore/3a52ac.wgsl
deleted file mode 100644
index c129d67..0000000
--- a/test/tint/builtins/gen/textureStore/3a52ac.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba16sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
-fn textureStore_3a52ac() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_3a52ac();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_3a52ac();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_3a52ac();
-}
diff --git a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl b/test/tint/builtins/gen/textureStore/3bb7a1.wgsl
deleted file mode 100644
index d1cc97c..0000000
--- a/test/tint/builtins/gen/textureStore/3bb7a1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<r32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
-fn textureStore_3bb7a1() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_3bb7a1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_3bb7a1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_3bb7a1();
-}
diff --git a/test/tint/builtins/gen/textureStore/3bec15.wgsl b/test/tint/builtins/gen/textureStore/3bec15.wgsl
deleted file mode 100644
index 6c2e068..0000000
--- a/test/tint/builtins/gen/textureStore/3bec15.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba8uint, write>, coords: i32, value: vec4<u32>)
-fn textureStore_3bec15() {
-  textureStore(arg_0, 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_3bec15();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_3bec15();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_3bec15();
-}
diff --git a/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.glsl
deleted file mode 100644
index dc8afb2..0000000
--- a/test/tint/builtins/gen/textureStore/3bec15.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_3bec15() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_3bec15();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_3bec15() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_3bec15();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_3bec15() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_3bec15();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/441ba8.wgsl b/test/tint/builtins/gen/textureStore/441ba8.wgsl
deleted file mode 100644
index 4082003..0000000
--- a/test/tint/builtins/gen/textureStore/441ba8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba32uint, write>, coords: vec3<i32>, value: vec4<u32>)
-fn textureStore_441ba8() {
-  textureStore(arg_0, vec3<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_441ba8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_441ba8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_441ba8();
-}
diff --git a/test/tint/builtins/gen/textureStore/4fc057.wgsl b/test/tint/builtins/gen/textureStore/4fc057.wgsl
deleted file mode 100644
index c95a1cf..0000000
--- a/test/tint/builtins/gen/textureStore/4fc057.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba8snorm, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
-fn textureStore_4fc057() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_4fc057();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_4fc057();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_4fc057();
-}
diff --git a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl b/test/tint/builtins/gen/textureStore/5a2f8f.wgsl
deleted file mode 100644
index 6d800c9..0000000
--- a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba16sint, write>, coords: i32, value: vec4<i32>)
-fn textureStore_5a2f8f() {
-  textureStore(arg_0, 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_5a2f8f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_5a2f8f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_5a2f8f();
-}
diff --git a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.glsl
deleted file mode 100644
index d94204d..0000000
--- a/test/tint/builtins/gen/textureStore/5a2f8f.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage1D arg_0;
-void textureStore_5a2f8f() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_5a2f8f();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba16i) uniform highp writeonly iimage1D arg_0;
-void textureStore_5a2f8f() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_5a2f8f();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba16i) uniform highp writeonly iimage1D arg_0;
-void textureStore_5a2f8f() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_5a2f8f();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/60975f.wgsl b/test/tint/builtins/gen/textureStore/60975f.wgsl
deleted file mode 100644
index 6ec4045..0000000
--- a/test/tint/builtins/gen/textureStore/60975f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba8unorm, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
-fn textureStore_60975f() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_60975f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_60975f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_60975f();
-}
diff --git a/test/tint/builtins/gen/textureStore/682fd6.wgsl b/test/tint/builtins/gen/textureStore/682fd6.wgsl
deleted file mode 100644
index 789c051..0000000
--- a/test/tint/builtins/gen/textureStore/682fd6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rg32uint, write>, coords: vec2<i32>, value: vec4<u32>)
-fn textureStore_682fd6() {
-  textureStore(arg_0, vec2<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_682fd6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_682fd6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_682fd6();
-}
diff --git a/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.glsl
deleted file mode 100644
index 4b5e639..0000000
--- a/test/tint/builtins/gen/textureStore/682fd6.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2D arg_0;
-void textureStore_682fd6() {
-  imageStore(arg_0, ivec2(0, 0), uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_682fd6();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage2D arg_0;
-void textureStore_682fd6() {
-  imageStore(arg_0, ivec2(0, 0), uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_682fd6();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2D arg_0;
-void textureStore_682fd6() {
-  imageStore(arg_0, ivec2(0, 0), uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_682fd6();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/6b75c3.wgsl b/test/tint/builtins/gen/textureStore/6b75c3.wgsl
deleted file mode 100644
index b6b95b6..0000000
--- a/test/tint/builtins/gen/textureStore/6b75c3.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba32float, write>, coords: i32, value: vec4<f32>)
-fn textureStore_6b75c3() {
-  textureStore(arg_0, 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_6b75c3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_6b75c3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_6b75c3();
-}
diff --git a/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.glsl
deleted file mode 100644
index 1a9dd67..0000000
--- a/test/tint/builtins/gen/textureStore/6b75c3.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba32f) uniform highp writeonly image1D arg_0;
-void textureStore_6b75c3() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_6b75c3();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba32f) uniform highp writeonly image1D arg_0;
-void textureStore_6b75c3() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_6b75c3();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba32f) uniform highp writeonly image1D arg_0;
-void textureStore_6b75c3() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_6b75c3();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/6b80d2.wgsl b/test/tint/builtins/gen/textureStore/6b80d2.wgsl
deleted file mode 100644
index 9e08506..0000000
--- a/test/tint/builtins/gen/textureStore/6b80d2.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
-
-// fn textureStore(texture: texture_storage_1d<r32sint, write>, coords: i32, value: vec4<i32>)
-fn textureStore_6b80d2() {
-  textureStore(arg_0, 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_6b80d2();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_6b80d2();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_6b80d2();
-}
diff --git a/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.glsl
deleted file mode 100644
index beb60b7..0000000
--- a/test/tint/builtins/gen/textureStore/6b80d2.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(r32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_6b80d2() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_6b80d2();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(r32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_6b80d2() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_6b80d2();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(r32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_6b80d2() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_6b80d2();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/6cff2e.wgsl b/test/tint/builtins/gen/textureStore/6cff2e.wgsl
deleted file mode 100644
index 79346c8..0000000
--- a/test/tint/builtins/gen/textureStore/6cff2e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
-
-// fn textureStore(texture: texture_storage_2d<r32uint, write>, coords: vec2<i32>, value: vec4<u32>)
-fn textureStore_6cff2e() {
-  textureStore(arg_0, vec2<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_6cff2e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_6cff2e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_6cff2e();
-}
diff --git a/test/tint/builtins/gen/textureStore/6da692.wgsl b/test/tint/builtins/gen/textureStore/6da692.wgsl
deleted file mode 100644
index adad2a6..0000000
--- a/test/tint/builtins/gen/textureStore/6da692.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba16uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
-fn textureStore_6da692() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_6da692();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_6da692();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_6da692();
-}
diff --git a/test/tint/builtins/gen/textureStore/731349.wgsl b/test/tint/builtins/gen/textureStore/731349.wgsl
deleted file mode 100644
index 82da1b3..0000000
--- a/test/tint/builtins/gen/textureStore/731349.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba8unorm, write>, coords: vec2<i32>, value: vec4<f32>)
-fn textureStore_731349() {
-  textureStore(arg_0, vec2<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_731349();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_731349();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_731349();
-}
diff --git a/test/tint/builtins/gen/textureStore/752da6.wgsl b/test/tint/builtins/gen/textureStore/752da6.wgsl
deleted file mode 100644
index 628b5e3..0000000
--- a/test/tint/builtins/gen/textureStore/752da6.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba32sint, write>, coords: vec2<i32>, value: vec4<i32>)
-fn textureStore_752da6() {
-  textureStore(arg_0, vec2<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_752da6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_752da6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_752da6();
-}
diff --git a/test/tint/builtins/gen/textureStore/77c0ae.wgsl b/test/tint/builtins/gen/textureStore/77c0ae.wgsl
deleted file mode 100644
index fd3e35b..0000000
--- a/test/tint/builtins/gen/textureStore/77c0ae.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba8uint, write>, coords: vec2<i32>, value: vec4<u32>)
-fn textureStore_77c0ae() {
-  textureStore(arg_0, vec2<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_77c0ae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_77c0ae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_77c0ae();
-}
diff --git a/test/tint/builtins/gen/textureStore/7cec8d.wgsl b/test/tint/builtins/gen/textureStore/7cec8d.wgsl
deleted file mode 100644
index 33f5538..0000000
--- a/test/tint/builtins/gen/textureStore/7cec8d.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
-fn textureStore_7cec8d() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_7cec8d();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_7cec8d();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_7cec8d();
-}
diff --git a/test/tint/builtins/gen/textureStore/7f7fae.wgsl b/test/tint/builtins/gen/textureStore/7f7fae.wgsl
deleted file mode 100644
index e65082e..0000000
--- a/test/tint/builtins/gen/textureStore/7f7fae.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba8unorm, write>, coords: i32, value: vec4<f32>)
-fn textureStore_7f7fae() {
-  textureStore(arg_0, 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_7f7fae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_7f7fae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_7f7fae();
-}
diff --git a/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.glsl
deleted file mode 100644
index f008dd1..0000000
--- a/test/tint/builtins/gen/textureStore/7f7fae.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8) uniform highp writeonly image1D arg_0;
-void textureStore_7f7fae() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_7f7fae();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8) uniform highp writeonly image1D arg_0;
-void textureStore_7f7fae() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_7f7fae();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8) uniform highp writeonly image1D arg_0;
-void textureStore_7f7fae() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_7f7fae();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/804942.wgsl b/test/tint/builtins/gen/textureStore/804942.wgsl
deleted file mode 100644
index 95ac550..0000000
--- a/test/tint/builtins/gen/textureStore/804942.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
-
-// fn textureStore(texture: texture_storage_2d<r32sint, write>, coords: vec2<i32>, value: vec4<i32>)
-fn textureStore_804942() {
-  textureStore(arg_0, vec2<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_804942();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_804942();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_804942();
-}
diff --git a/test/tint/builtins/gen/textureStore/805dae.wgsl b/test/tint/builtins/gen/textureStore/805dae.wgsl
deleted file mode 100644
index 9d96265..0000000
--- a/test/tint/builtins/gen/textureStore/805dae.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba8snorm, write>, coords: vec2<i32>, value: vec4<f32>)
-fn textureStore_805dae() {
-  textureStore(arg_0, vec2<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_805dae();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_805dae();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_805dae();
-}
diff --git a/test/tint/builtins/gen/textureStore/83bcc1.wgsl b/test/tint/builtins/gen/textureStore/83bcc1.wgsl
deleted file mode 100644
index fad3817..0000000
--- a/test/tint/builtins/gen/textureStore/83bcc1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rg32uint, write>, coords: i32, value: vec4<u32>)
-fn textureStore_83bcc1() {
-  textureStore(arg_0, 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_83bcc1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_83bcc1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_83bcc1();
-}
diff --git a/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.glsl
deleted file mode 100644
index 18fe898..0000000
--- a/test/tint/builtins/gen/textureStore/83bcc1.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_83bcc1() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_83bcc1();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_83bcc1() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_83bcc1();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_83bcc1() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_83bcc1();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/872747.wgsl b/test/tint/builtins/gen/textureStore/872747.wgsl
deleted file mode 100644
index ebb8f45..0000000
--- a/test/tint/builtins/gen/textureStore/872747.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
-
-// fn textureStore(texture: texture_storage_1d<rg32float, write>, coords: i32, value: vec4<f32>)
-fn textureStore_872747() {
-  textureStore(arg_0, 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_872747();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_872747();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_872747();
-}
diff --git a/test/tint/builtins/gen/textureStore/872747.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/872747.wgsl.expected.glsl
deleted file mode 100644
index afd9b08..0000000
--- a/test/tint/builtins/gen/textureStore/872747.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image1D arg_0;
-void textureStore_872747() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_872747();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image1D arg_0;
-void textureStore_872747() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_872747();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image1D arg_0;
-void textureStore_872747() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_872747();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/8e0479.wgsl b/test/tint/builtins/gen/textureStore/8e0479.wgsl
deleted file mode 100644
index e948201..0000000
--- a/test/tint/builtins/gen/textureStore/8e0479.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
-fn textureStore_8e0479() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_8e0479();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_8e0479();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_8e0479();
-}
diff --git a/test/tint/builtins/gen/textureStore/8f71a1.wgsl b/test/tint/builtins/gen/textureStore/8f71a1.wgsl
deleted file mode 100644
index 4d7c91e..0000000
--- a/test/tint/builtins/gen/textureStore/8f71a1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba16sint, write>, coords: vec3<i32>, value: vec4<i32>)
-fn textureStore_8f71a1() {
-  textureStore(arg_0, vec3<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_8f71a1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_8f71a1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_8f71a1();
-}
diff --git a/test/tint/builtins/gen/textureStore/969534.wgsl b/test/tint/builtins/gen/textureStore/969534.wgsl
deleted file mode 100644
index 5897793..0000000
--- a/test/tint/builtins/gen/textureStore/969534.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba32sint, write>, coords: i32, value: vec4<i32>)
-fn textureStore_969534() {
-  textureStore(arg_0, 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_969534();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_969534();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_969534();
-}
diff --git a/test/tint/builtins/gen/textureStore/969534.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/969534.wgsl.expected.glsl
deleted file mode 100644
index c9fdae9..0000000
--- a/test/tint/builtins/gen/textureStore/969534.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_969534() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_969534();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_969534() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_969534();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_969534() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_969534();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl b/test/tint/builtins/gen/textureStore/9a3ecc.wgsl
deleted file mode 100644
index 6fd2d30..0000000
--- a/test/tint/builtins/gen/textureStore/9a3ecc.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba32sint, write>, coords: vec3<i32>, value: vec4<i32>)
-fn textureStore_9a3ecc() {
-  textureStore(arg_0, vec3<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_9a3ecc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_9a3ecc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_9a3ecc();
-}
diff --git a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl b/test/tint/builtins/gen/textureStore/9d9cd5.wgsl
deleted file mode 100644
index 4c09b3a..0000000
--- a/test/tint/builtins/gen/textureStore/9d9cd5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
-fn textureStore_9d9cd5() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_9d9cd5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_9d9cd5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_9d9cd5();
-}
diff --git a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl b/test/tint/builtins/gen/textureStore/9e3ec5.wgsl
deleted file mode 100644
index 72323bd..0000000
--- a/test/tint/builtins/gen/textureStore/9e3ec5.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba16sint, write>, coords: vec2<i32>, value: vec4<i32>)
-fn textureStore_9e3ec5() {
-  textureStore(arg_0, vec2<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_9e3ec5();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_9e3ec5();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_9e3ec5();
-}
diff --git a/test/tint/builtins/gen/textureStore/ac67aa.wgsl b/test/tint/builtins/gen/textureStore/ac67aa.wgsl
deleted file mode 100644
index e9392db..0000000
--- a/test/tint/builtins/gen/textureStore/ac67aa.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rg32uint, write>, coords: vec3<i32>, value: vec4<u32>)
-fn textureStore_ac67aa() {
-  textureStore(arg_0, vec3<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_ac67aa();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_ac67aa();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_ac67aa();
-}
diff --git a/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.glsl
deleted file mode 100644
index d11d5c1..0000000
--- a/test/tint/builtins/gen/textureStore/ac67aa.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage3D arg_0;
-void textureStore_ac67aa() {
-  imageStore(arg_0, ivec3(0, 0, 0), uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_ac67aa();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage3D arg_0;
-void textureStore_ac67aa() {
-  imageStore(arg_0, ivec3(0, 0, 0), uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_ac67aa();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage3D arg_0;
-void textureStore_ac67aa() {
-  imageStore(arg_0, ivec3(0, 0, 0), uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_ac67aa();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/b706b1.wgsl b/test/tint/builtins/gen/textureStore/b706b1.wgsl
deleted file mode 100644
index bd55c9e..0000000
--- a/test/tint/builtins/gen/textureStore/b706b1.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba8sint, write>, coords: vec3<i32>, value: vec4<i32>)
-fn textureStore_b706b1() {
-  textureStore(arg_0, vec3<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_b706b1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_b706b1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_b706b1();
-}
diff --git a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl b/test/tint/builtins/gen/textureStore/bbcb7f.wgsl
deleted file mode 100644
index b220ec5..0000000
--- a/test/tint/builtins/gen/textureStore/bbcb7f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba8sint, write>, coords: vec2<i32>, value: vec4<i32>)
-fn textureStore_bbcb7f() {
-  textureStore(arg_0, vec2<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_bbcb7f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_bbcb7f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_bbcb7f();
-}
diff --git a/test/tint/builtins/gen/textureStore/be6e30.wgsl b/test/tint/builtins/gen/textureStore/be6e30.wgsl
deleted file mode 100644
index af203c8..0000000
--- a/test/tint/builtins/gen/textureStore/be6e30.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
-
-// fn textureStore(texture: texture_storage_2d<rgba16float, write>, coords: vec2<i32>, value: vec4<f32>)
-fn textureStore_be6e30() {
-  textureStore(arg_0, vec2<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_be6e30();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_be6e30();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_be6e30();
-}
diff --git a/test/tint/builtins/gen/textureStore/bf775c.wgsl b/test/tint/builtins/gen/textureStore/bf775c.wgsl
deleted file mode 100644
index c793b5f..0000000
--- a/test/tint/builtins/gen/textureStore/bf775c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba8sint, write>, coords: i32, value: vec4<i32>)
-fn textureStore_bf775c() {
-  textureStore(arg_0, 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_bf775c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_bf775c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_bf775c();
-}
diff --git a/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.glsl
deleted file mode 100644
index 38cb0e5..0000000
--- a/test/tint/builtins/gen/textureStore/bf775c.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage1D arg_0;
-void textureStore_bf775c() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_bf775c();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba8i) uniform highp writeonly iimage1D arg_0;
-void textureStore_bf775c() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_bf775c();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'iimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba8i) uniform highp writeonly iimage1D arg_0;
-void textureStore_bf775c() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_bf775c();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'iimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/c5af1e.wgsl b/test/tint/builtins/gen/textureStore/c5af1e.wgsl
deleted file mode 100644
index 8c8a49d..0000000
--- a/test/tint/builtins/gen/textureStore/c5af1e.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba16float, write>, coords: vec3<i32>, value: vec4<f32>)
-fn textureStore_c5af1e() {
-  textureStore(arg_0, vec3<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_c5af1e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_c5af1e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_c5af1e();
-}
diff --git a/test/tint/builtins/gen/textureStore/c863be.wgsl b/test/tint/builtins/gen/textureStore/c863be.wgsl
deleted file mode 100644
index 2e60dd2..0000000
--- a/test/tint/builtins/gen/textureStore/c863be.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rg32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
-fn textureStore_c863be() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_c863be();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_c863be();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_c863be();
-}
diff --git a/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.glsl
deleted file mode 100644
index 57d609d..0000000
--- a/test/tint/builtins/gen/textureStore/c863be.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureStore_c863be() {
-  imageStore(arg_0, ivec3(0, 0, 1), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_c863be();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureStore_c863be() {
-  imageStore(arg_0, ivec3(0, 0, 1), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_c863be();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image2DArray arg_0;
-void textureStore_c863be() {
-  imageStore(arg_0, ivec3(0, 0, 1), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_c863be();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/d73b5c.wgsl b/test/tint/builtins/gen/textureStore/d73b5c.wgsl
deleted file mode 100644
index 21d95b9..0000000
--- a/test/tint/builtins/gen/textureStore/d73b5c.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rg32sint, write>, coords: i32, value: vec4<i32>)
-fn textureStore_d73b5c() {
-  textureStore(arg_0, 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_d73b5c();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_d73b5c();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_d73b5c();
-}
diff --git a/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.glsl
deleted file mode 100644
index 2c8d566..0000000
--- a/test/tint/builtins/gen/textureStore/d73b5c.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_d73b5c() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_d73b5c();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_d73b5c() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_d73b5c();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage1D arg_0;
-void textureStore_d73b5c() {
-  imageStore(arg_0, 1, ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_d73b5c();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/dd7d81.wgsl b/test/tint/builtins/gen/textureStore/dd7d81.wgsl
deleted file mode 100644
index 93a30cd..0000000
--- a/test/tint/builtins/gen/textureStore/dd7d81.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba8snorm, write>, coords: vec3<i32>, value: vec4<f32>)
-fn textureStore_dd7d81() {
-  textureStore(arg_0, vec3<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_dd7d81();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_dd7d81();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_dd7d81();
-}
diff --git a/test/tint/builtins/gen/textureStore/dde364.wgsl b/test/tint/builtins/gen/textureStore/dde364.wgsl
deleted file mode 100644
index d613cb7..0000000
--- a/test/tint/builtins/gen/textureStore/dde364.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rg32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
-fn textureStore_dde364() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_dde364();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_dde364();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_dde364();
-}
diff --git a/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.glsl
deleted file mode 100644
index 43f3727..0000000
--- a/test/tint/builtins/gen/textureStore/dde364.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureStore_dde364() {
-  imageStore(arg_0, ivec3(0, 0, 1), uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_dde364();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureStore_dde364() {
-  imageStore(arg_0, ivec3(0, 0, 1), uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_dde364();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32ui) uniform highp writeonly uimage2DArray arg_0;
-void textureStore_dde364() {
-  imageStore(arg_0, ivec3(0, 0, 1), uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_dde364();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/e885e8.wgsl b/test/tint/builtins/gen/textureStore/e885e8.wgsl
deleted file mode 100644
index 025f448..0000000
--- a/test/tint/builtins/gen/textureStore/e885e8.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba16float, write>, coords: i32, value: vec4<f32>)
-fn textureStore_e885e8() {
-  textureStore(arg_0, 1, vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_e885e8();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_e885e8();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_e885e8();
-}
diff --git a/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.glsl
deleted file mode 100644
index a631fca..0000000
--- a/test/tint/builtins/gen/textureStore/e885e8.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba16f) uniform highp writeonly image1D arg_0;
-void textureStore_e885e8() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_e885e8();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba16f) uniform highp writeonly image1D arg_0;
-void textureStore_e885e8() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_e885e8();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba16f) uniform highp writeonly image1D arg_0;
-void textureStore_e885e8() {
-  imageStore(arg_0, 1, vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_e885e8();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/eb702f.wgsl b/test/tint/builtins/gen/textureStore/eb702f.wgsl
deleted file mode 100644
index a188948..0000000
--- a/test/tint/builtins/gen/textureStore/eb702f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
-
-// fn textureStore(texture: texture_storage_3d<r32float, write>, coords: vec3<i32>, value: vec4<f32>)
-fn textureStore_eb702f() {
-  textureStore(arg_0, vec3<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_eb702f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_eb702f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_eb702f();
-}
diff --git a/test/tint/builtins/gen/textureStore/eb78b9.wgsl b/test/tint/builtins/gen/textureStore/eb78b9.wgsl
deleted file mode 100644
index 5c1857b..0000000
--- a/test/tint/builtins/gen/textureStore/eb78b9.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
-
-// fn textureStore(texture: texture_storage_3d<r32sint, write>, coords: vec3<i32>, value: vec4<i32>)
-fn textureStore_eb78b9() {
-  textureStore(arg_0, vec3<i32>(), vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_eb78b9();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_eb78b9();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_eb78b9();
-}
diff --git a/test/tint/builtins/gen/textureStore/ee6acc.wgsl b/test/tint/builtins/gen/textureStore/ee6acc.wgsl
deleted file mode 100644
index 43201cc..0000000
--- a/test/tint/builtins/gen/textureStore/ee6acc.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
-
-// fn textureStore(texture: texture_storage_3d<rg32float, write>, coords: vec3<i32>, value: vec4<f32>)
-fn textureStore_ee6acc() {
-  textureStore(arg_0, vec3<i32>(), vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_ee6acc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_ee6acc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_ee6acc();
-}
diff --git a/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.glsl
deleted file mode 100644
index 7931031..0000000
--- a/test/tint/builtins/gen/textureStore/ee6acc.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image3D arg_0;
-void textureStore_ee6acc() {
-  imageStore(arg_0, ivec3(0, 0, 0), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-vec4 vertex_main() {
-  textureStore_ee6acc();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32f) uniform highp writeonly image3D arg_0;
-void textureStore_ee6acc() {
-  imageStore(arg_0, ivec3(0, 0, 0), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void fragment_main() {
-  textureStore_ee6acc();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32f) uniform highp writeonly image3D arg_0;
-void textureStore_ee6acc() {
-  imageStore(arg_0, ivec3(0, 0, 0), vec4(0.0f, 0.0f, 0.0f, 0.0f));
-}
-
-void compute_main() {
-  textureStore_ee6acc();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl b/test/tint/builtins/gen/textureStore/ef9f2f.wgsl
deleted file mode 100644
index 6296d30..0000000
--- a/test/tint/builtins/gen/textureStore/ef9f2f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
-
-// fn textureStore(texture: texture_storage_3d<r32uint, write>, coords: vec3<i32>, value: vec4<u32>)
-fn textureStore_ef9f2f() {
-  textureStore(arg_0, vec3<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_ef9f2f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_ef9f2f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_ef9f2f();
-}
diff --git a/test/tint/builtins/gen/textureStore/f8dead.wgsl b/test/tint/builtins/gen/textureStore/f8dead.wgsl
deleted file mode 100644
index 8954b30..0000000
--- a/test/tint/builtins/gen/textureStore/f8dead.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
-
-// fn textureStore(texture: texture_storage_3d<rgba8uint, write>, coords: vec3<i32>, value: vec4<u32>)
-fn textureStore_f8dead() {
-  textureStore(arg_0, vec3<i32>(), vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_f8dead();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_f8dead();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_f8dead();
-}
diff --git a/test/tint/builtins/gen/textureStore/f9be83.wgsl b/test/tint/builtins/gen/textureStore/f9be83.wgsl
deleted file mode 100644
index 09830dc..0000000
--- a/test/tint/builtins/gen/textureStore/f9be83.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rg32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
-fn textureStore_f9be83() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_f9be83();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_f9be83();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_f9be83();
-}
diff --git a/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.glsl
deleted file mode 100644
index 975a5db..0000000
--- a/test/tint/builtins/gen/textureStore/f9be83.wgsl.expected.glsl
+++ /dev/null
@@ -1,75 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureStore_f9be83() {
-  imageStore(arg_0, ivec3(0, 0, 1), ivec4(0, 0, 0, 0));
-}
-
-vec4 vertex_main() {
-  textureStore_f9be83();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureStore_f9be83() {
-  imageStore(arg_0, ivec3(0, 0, 1), ivec4(0, 0, 0, 0));
-}
-
-void fragment_main() {
-  textureStore_f9be83();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'image load-store format' : not supported with this profile: es
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rg32i) uniform highp writeonly iimage2DArray arg_0;
-void textureStore_f9be83() {
-  imageStore(arg_0, ivec3(0, 0, 1), ivec4(0, 0, 0, 0));
-}
-
-void compute_main() {
-  textureStore_f9be83();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'image load-store format' : not supported with this profile: es
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl b/test/tint/builtins/gen/textureStore/fb9a8f.wgsl
deleted file mode 100644
index 78ac51e..0000000
--- a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
-
-// fn textureStore(texture: texture_storage_1d<rgba32uint, write>, coords: i32, value: vec4<u32>)
-fn textureStore_fb9a8f() {
-  textureStore(arg_0, 1, vec4<u32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_fb9a8f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_fb9a8f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_fb9a8f();
-}
diff --git a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.glsl b/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.glsl
deleted file mode 100644
index b50c0e4..0000000
--- a/test/tint/builtins/gen/textureStore/fb9a8f.wgsl.expected.glsl
+++ /dev/null
@@ -1,78 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_fb9a8f() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-vec4 vertex_main() {
-  textureStore_fb9a8f();
-  return vec4(0.0f, 0.0f, 0.0f, 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;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-precision mediump float;
-
-layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_fb9a8f() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void fragment_main() {
-  textureStore_fb9a8f();
-}
-
-void main() {
-  fragment_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:4: 'uimage1D' : Reserved word. 
-WARNING: 0:4: 'layout' : useless application of layout qualifier 
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
-#version 310 es
-
-layout(rgba32ui) uniform highp writeonly uimage1D arg_0;
-void textureStore_fb9a8f() {
-  imageStore(arg_0, 1, uvec4(0u, 0u, 0u, 0u));
-}
-
-void compute_main() {
-  textureStore_fb9a8f();
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
-  compute_main();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:3: 'uimage1D' : Reserved word. 
-WARNING: 0:3: 'layout' : useless application of layout qualifier 
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureStore/fbf53f.wgsl b/test/tint/builtins/gen/textureStore/fbf53f.wgsl
deleted file mode 100644
index d0d41a1..0000000
--- a/test/tint/builtins/gen/textureStore/fbf53f.wgsl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
-
-// fn textureStore(texture: texture_storage_2d_array<rgba8sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
-fn textureStore_fbf53f() {
-  textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  textureStore_fbf53f();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  textureStore_fbf53f();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  textureStore_fbf53f();
-}
diff --git a/test/tint/builtins/gen/transpose/2585cd.wgsl b/test/tint/builtins/gen/transpose/2585cd.wgsl
deleted file mode 100644
index f111002..0000000
--- a/test/tint/builtins/gen/transpose/2585cd.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<4, 3, f32>) -> mat<3, 4, f32>
-fn transpose_2585cd() {
-  var res: mat3x4<f32> = transpose(mat4x3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_2585cd();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_2585cd();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_2585cd();
-}
diff --git a/test/tint/builtins/gen/transpose/31d679.wgsl b/test/tint/builtins/gen/transpose/31d679.wgsl
deleted file mode 100644
index 18c1a51..0000000
--- a/test/tint/builtins/gen/transpose/31d679.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<2, 2, f32>) -> mat<2, 2, f32>
-fn transpose_31d679() {
-  var res: mat2x2<f32> = transpose(mat2x2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_31d679();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_31d679();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_31d679();
-}
diff --git a/test/tint/builtins/gen/transpose/31e37e.wgsl b/test/tint/builtins/gen/transpose/31e37e.wgsl
deleted file mode 100644
index 1b411a7..0000000
--- a/test/tint/builtins/gen/transpose/31e37e.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<4, 2, f32>) -> mat<2, 4, f32>
-fn transpose_31e37e() {
-  var res: mat2x4<f32> = transpose(mat4x2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_31e37e();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_31e37e();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_31e37e();
-}
diff --git a/test/tint/builtins/gen/transpose/4ce359.wgsl b/test/tint/builtins/gen/transpose/4ce359.wgsl
deleted file mode 100644
index 947cd87..0000000
--- a/test/tint/builtins/gen/transpose/4ce359.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<2, 4, f32>) -> mat<4, 2, f32>
-fn transpose_4ce359() {
-  var res: mat4x2<f32> = transpose(mat2x4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_4ce359();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_4ce359();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_4ce359();
-}
diff --git a/test/tint/builtins/gen/transpose/4dc9a1.wgsl b/test/tint/builtins/gen/transpose/4dc9a1.wgsl
deleted file mode 100644
index f4d5dc3..0000000
--- a/test/tint/builtins/gen/transpose/4dc9a1.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<2, 3, f32>) -> mat<3, 2, f32>
-fn transpose_4dc9a1() {
-  var res: mat3x2<f32> = transpose(mat2x3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_4dc9a1();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_4dc9a1();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_4dc9a1();
-}
diff --git a/test/tint/builtins/gen/transpose/854336.wgsl b/test/tint/builtins/gen/transpose/854336.wgsl
deleted file mode 100644
index ffb40b7..0000000
--- a/test/tint/builtins/gen/transpose/854336.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<3, 3, f32>) -> mat<3, 3, f32>
-fn transpose_854336() {
-  var res: mat3x3<f32> = transpose(mat3x3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_854336();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_854336();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_854336();
-}
diff --git a/test/tint/builtins/gen/transpose/c1b600.wgsl b/test/tint/builtins/gen/transpose/c1b600.wgsl
deleted file mode 100644
index 7e4683f..0000000
--- a/test/tint/builtins/gen/transpose/c1b600.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<4, 4, f32>) -> mat<4, 4, f32>
-fn transpose_c1b600() {
-  var res: mat4x4<f32> = transpose(mat4x4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_c1b600();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_c1b600();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_c1b600();
-}
diff --git a/test/tint/builtins/gen/transpose/d8f8ba.wgsl b/test/tint/builtins/gen/transpose/d8f8ba.wgsl
deleted file mode 100644
index f8ec16c..0000000
--- a/test/tint/builtins/gen/transpose/d8f8ba.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<3, 4, f32>) -> mat<4, 3, f32>
-fn transpose_d8f8ba() {
-  var res: mat4x3<f32> = transpose(mat3x4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_d8f8ba();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_d8f8ba();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_d8f8ba();
-}
diff --git a/test/tint/builtins/gen/transpose/ed4bdc.wgsl b/test/tint/builtins/gen/transpose/ed4bdc.wgsl
deleted file mode 100644
index 9b5fb4b..0000000
--- a/test/tint/builtins/gen/transpose/ed4bdc.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn transpose(mat<3, 2, f32>) -> mat<2, 3, f32>
-fn transpose_ed4bdc() {
-  var res: mat2x3<f32> = transpose(mat3x2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  transpose_ed4bdc();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  transpose_ed4bdc();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  transpose_ed4bdc();
-}
diff --git a/test/tint/builtins/gen/trunc/562d05.wgsl b/test/tint/builtins/gen/trunc/562d05.wgsl
deleted file mode 100644
index 4aab73d..0000000
--- a/test/tint/builtins/gen/trunc/562d05.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn trunc(vec<3, f32>) -> vec<3, f32>
-fn trunc_562d05() {
-  var res: vec3<f32> = trunc(vec3<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  trunc_562d05();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  trunc_562d05();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  trunc_562d05();
-}
diff --git a/test/tint/builtins/gen/trunc/e183aa.wgsl b/test/tint/builtins/gen/trunc/e183aa.wgsl
deleted file mode 100644
index bd01e6f..0000000
--- a/test/tint/builtins/gen/trunc/e183aa.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn trunc(vec<4, f32>) -> vec<4, f32>
-fn trunc_e183aa() {
-  var res: vec4<f32> = trunc(vec4<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  trunc_e183aa();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  trunc_e183aa();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  trunc_e183aa();
-}
diff --git a/test/tint/builtins/gen/trunc/eb83df.wgsl b/test/tint/builtins/gen/trunc/eb83df.wgsl
deleted file mode 100644
index 406f2a3..0000000
--- a/test/tint/builtins/gen/trunc/eb83df.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn trunc(f32) -> f32
-fn trunc_eb83df() {
-  var res: f32 = trunc(1.0);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  trunc_eb83df();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  trunc_eb83df();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  trunc_eb83df();
-}
diff --git a/test/tint/builtins/gen/trunc/f370d3.wgsl b/test/tint/builtins/gen/trunc/f370d3.wgsl
deleted file mode 100644
index cb6e843..0000000
--- a/test/tint/builtins/gen/trunc/f370d3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn trunc(vec<2, f32>) -> vec<2, f32>
-fn trunc_f370d3() {
-  var res: vec2<f32> = trunc(vec2<f32>());
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  trunc_f370d3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  trunc_f370d3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  trunc_f370d3();
-}
diff --git a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl b/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl
deleted file mode 100644
index c3dbec2..0000000
--- a/test/tint/builtins/gen/unpack2x16float/32a5cf.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn unpack2x16float(u32) -> vec2<f32>
-fn unpack2x16float_32a5cf() {
-  var res: vec2<f32> = unpack2x16float(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  unpack2x16float_32a5cf();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  unpack2x16float_32a5cf();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  unpack2x16float_32a5cf();
-}
diff --git a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl b/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl
deleted file mode 100644
index 3a5952e..0000000
--- a/test/tint/builtins/gen/unpack2x16snorm/b4aea6.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn unpack2x16snorm(u32) -> vec2<f32>
-fn unpack2x16snorm_b4aea6() {
-  var res: vec2<f32> = unpack2x16snorm(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  unpack2x16snorm_b4aea6();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  unpack2x16snorm_b4aea6();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  unpack2x16snorm_b4aea6();
-}
diff --git a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl b/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl
deleted file mode 100644
index 82e0ce9..0000000
--- a/test/tint/builtins/gen/unpack2x16unorm/7699c0.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn unpack2x16unorm(u32) -> vec2<f32>
-fn unpack2x16unorm_7699c0() {
-  var res: vec2<f32> = unpack2x16unorm(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  unpack2x16unorm_7699c0();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  unpack2x16unorm_7699c0();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  unpack2x16unorm_7699c0();
-}
diff --git a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl b/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl
deleted file mode 100644
index 6cabee7..0000000
--- a/test/tint/builtins/gen/unpack4x8snorm/523fb3.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn unpack4x8snorm(u32) -> vec4<f32>
-fn unpack4x8snorm_523fb3() {
-  var res: vec4<f32> = unpack4x8snorm(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  unpack4x8snorm_523fb3();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  unpack4x8snorm_523fb3();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  unpack4x8snorm_523fb3();
-}
diff --git a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl b/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl
deleted file mode 100644
index cee8f63..0000000
--- a/test/tint/builtins/gen/unpack4x8unorm/750c74.wgsl
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn unpack4x8unorm(u32) -> vec4<f32>
-fn unpack4x8unorm_750c74() {
-  var res: vec4<f32> = unpack4x8unorm(1u);
-}
-
-@stage(vertex)
-fn vertex_main() -> @builtin(position) vec4<f32> {
-  unpack4x8unorm_750c74();
-  return vec4<f32>();
-}
-
-@stage(fragment)
-fn fragment_main() {
-  unpack4x8unorm_750c74();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  unpack4x8unorm_750c74();
-}
diff --git a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl b/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl
deleted file mode 100644
index 2f1d6d6..0000000
--- a/test/tint/builtins/gen/workgroupBarrier/a17f7f.wgsl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-////////////////////////////////////////////////////////////////////////////////
-// File generated by tools/intrinsic-gen
-// using the template:
-//   test/tint/builtins/builtins.wgsl.tmpl
-// and the intrinsic defintion file:
-//   src/tint/intrinsics.def
-//
-// Do not modify this file directly
-////////////////////////////////////////////////////////////////////////////////
-
-
-// fn workgroupBarrier()
-fn workgroupBarrier_a17f7f() {
-  workgroupBarrier();
-}
-
-@stage(compute) @workgroup_size(1)
-fn compute_main() {
-  workgroupBarrier_a17f7f();
-}
