GLSL: fix countOneBits().

This change essentially relands 10c554ecf43bd50eaf99d371eb1af50cf78170b2,
aka https://dawn-review.googlesource.com/c/tint/+/82140.

(Somehow, I managed to revert most of that in the subsequent CL for
reverseBits. I suspect a bad upstream and/or rebase.)

Bug: tint:1430
Change-Id: Iba2688294dcd7d3008ee9da78957a7a464ca1c0f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/82220
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index 909cfd6..0df3c2c 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -646,6 +646,9 @@
   if (builtin->IsTexture()) {
     return EmitTextureCall(out, call, builtin);
   }
+  if (builtin->Type() == sem::BuiltinType::kCountOneBits) {
+    return EmitCountOneBitsCall(out, expr);
+  }
   if (builtin->Type() == sem::BuiltinType::kSelect) {
     return EmitSelectCall(out, expr);
   }
@@ -940,6 +943,23 @@
   return true;
 }
 
+bool GeneratorImpl::EmitCountOneBitsCall(std::ostream& out,
+                                         const ast::CallExpression* expr) {
+  // GLSL's bitCount returns an integer type, so cast it to the appropriate
+  // unsigned type.
+  if (!EmitType(out, TypeOf(expr)->UnwrapRef(), ast::StorageClass::kNone,
+                ast::Access::kReadWrite, "")) {
+    return false;
+  }
+  out << "(bitCount(";
+
+  if (!EmitExpression(out, expr->args[0])) {
+    return false;
+  }
+  out << "))";
+  return true;
+}
+
 bool GeneratorImpl::EmitSelectCall(std::ostream& out,
                                    const ast::CallExpression* expr) {
   auto* expr_false = expr->args[0];
@@ -1534,7 +1554,7 @@
     case sem::BuiltinType::kAtan2:
       return "atan";
     case sem::BuiltinType::kCountOneBits:
-      return "countbits";
+      return "bitCount";
     case sem::BuiltinType::kDpdx:
       return "dFdx";
     case sem::BuiltinType::kDpdxCoarse:
diff --git a/src/tint/writer/glsl/generator_impl.h b/src/tint/writer/glsl/generator_impl.h
index 73e08d5..1a591a4 100644
--- a/src/tint/writer/glsl/generator_impl.h
+++ b/src/tint/writer/glsl/generator_impl.h
@@ -204,6 +204,11 @@
   /// @param out the output of the expression stream
   /// @param expr the call expression
   /// @returns true if the call expression is emitted
+  bool EmitCountOneBitsCall(std::ostream& out, const ast::CallExpression* expr);
+  /// Handles generating a call to the `countOneBits()` builtin
+  /// @param out the output of the expression stream
+  /// @param expr the call expression
+  /// @returns true if the call expression is emitted
   bool EmitSelectCall(std::ostream& out, const ast::CallExpression* expr);
   /// Handles generating a call to the `dot()` builtin
   /// @param out the output of the expression stream
diff --git a/src/tint/writer/glsl/generator_impl_builtin_test.cc b/src/tint/writer/glsl/generator_impl_builtin_test.cc
index fa11d2a..f96a463 100644
--- a/src/tint/writer/glsl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/glsl/generator_impl_builtin_test.cc
@@ -198,7 +198,7 @@
         BuiltinData{BuiltinType::kClamp, ParamType::kU32, "clamp"},
         BuiltinData{BuiltinType::kCos, ParamType::kF32, "cos"},
         BuiltinData{BuiltinType::kCosh, ParamType::kF32, "cosh"},
-        BuiltinData{BuiltinType::kCountOneBits, ParamType::kU32, "countbits"},
+        BuiltinData{BuiltinType::kCountOneBits, ParamType::kU32, "bitCount"},
         BuiltinData{BuiltinType::kCross, ParamType::kF32, "cross"},
         BuiltinData{BuiltinType::kDeterminant, ParamType::kF32, "determinant"},
         BuiltinData{BuiltinType::kDistance, ParamType::kF32, "distance"},
diff --git a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.glsl
index bf9a227..11f62b4 100644
--- a/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/0d0e46.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_0d0e46() {
-  uvec4 res = countbits(uvec4(0u, 0u, 0u, 0u));
+  uvec4 res = uvec4(bitCount(uvec4(0u, 0u, 0u, 0u)));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_0d0e46() {
-  uvec4 res = countbits(uvec4(0u, 0u, 0u, 0u));
+  uvec4 res = uvec4(bitCount(uvec4(0u, 0u, 0u, 0u)));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of uint'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_0d0e46() {
-  uvec4 res = countbits(uvec4(0u, 0u, 0u, 0u));
+  uvec4 res = uvec4(bitCount(uvec4(0u, 0u, 0u, 0u)));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.glsl
index d4e690c..2dafae1 100644
--- a/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/0f7980.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_0f7980() {
-  ivec4 res = countbits(ivec4(0, 0, 0, 0));
+  ivec4 res = ivec4(bitCount(ivec4(0, 0, 0, 0)));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_0f7980() {
-  ivec4 res = countbits(ivec4(0, 0, 0, 0));
+  ivec4 res = ivec4(bitCount(ivec4(0, 0, 0, 0)));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_0f7980() {
-  ivec4 res = countbits(ivec4(0, 0, 0, 0));
+  ivec4 res = ivec4(bitCount(ivec4(0, 0, 0, 0)));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.glsl
index 2f4d946..abdbb04 100644
--- a/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/65d2ae.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_65d2ae() {
-  ivec3 res = countbits(ivec3(0, 0, 0));
+  ivec3 res = ivec3(bitCount(ivec3(0, 0, 0)));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 3-component vector of int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_65d2ae() {
-  ivec3 res = countbits(ivec3(0, 0, 0));
+  ivec3 res = ivec3(bitCount(ivec3(0, 0, 0)));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump 3-component vector of int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_65d2ae() {
-  ivec3 res = countbits(ivec3(0, 0, 0));
+  ivec3 res = ivec3(bitCount(ivec3(0, 0, 0)));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 3-component vector of int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.glsl
index 80fbd03..95e26f1 100644
--- a/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/690cfc.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_690cfc() {
-  uvec3 res = countbits(uvec3(0u, 0u, 0u));
+  uvec3 res = uvec3(bitCount(uvec3(0u, 0u, 0u)));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 3-component vector of uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_690cfc() {
-  uvec3 res = countbits(uvec3(0u, 0u, 0u));
+  uvec3 res = uvec3(bitCount(uvec3(0u, 0u, 0u)));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump 3-component vector of uint'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_690cfc() {
-  uvec3 res = countbits(uvec3(0u, 0u, 0u));
+  uvec3 res = uvec3(bitCount(uvec3(0u, 0u, 0u)));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 3-component vector of uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.glsl
index f4d3c55..214e0d9 100644
--- a/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/94fd81.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_94fd81() {
-  uvec2 res = countbits(uvec2(0u, 0u));
+  uvec2 res = uvec2(bitCount(uvec2(0u, 0u)));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 2-component vector of uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_94fd81() {
-  uvec2 res = countbits(uvec2(0u, 0u));
+  uvec2 res = uvec2(bitCount(uvec2(0u, 0u)));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump 2-component vector of uint'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_94fd81() {
-  uvec2 res = countbits(uvec2(0u, 0u));
+  uvec2 res = uvec2(bitCount(uvec2(0u, 0u)));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 2-component vector of uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.glsl
index 6d26ecd..cf72302 100644
--- a/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/ae44f9.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_ae44f9() {
-  uint res = countbits(1u);
+  uint res = uint(bitCount(1u));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_ae44f9() {
-  uint res = countbits(1u);
+  uint res = uint(bitCount(1u));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump uint'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_ae44f9() {
-  uint res = countbits(1u);
+  uint res = uint(bitCount(1u));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp uint'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.glsl
index 13673ed..2e87592 100644
--- a/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/af90e2.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_af90e2() {
-  ivec2 res = countbits(ivec2(0, 0));
+  ivec2 res = ivec2(bitCount(ivec2(0, 0)));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 2-component vector of int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_af90e2() {
-  ivec2 res = countbits(ivec2(0, 0));
+  ivec2 res = ivec2(bitCount(ivec2(0, 0)));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump 2-component vector of int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_af90e2() {
-  ivec2 res = countbits(ivec2(0, 0));
+  ivec2 res = ivec2(bitCount(ivec2(0, 0)));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp 2-component vector of int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.glsl b/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.glsl
index 22f32fc..bf825f0 100644
--- a/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/countOneBits/fd88b2.wgsl.expected.glsl
@@ -1,9 +1,7 @@
-SKIP: FAILED
-
 #version 310 es
 
 void countOneBits_fd88b2() {
-  int res = countbits(1);
+  int res = int(bitCount(1));
 }
 
 vec4 vertex_main() {
@@ -18,19 +16,11 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
 void countOneBits_fd88b2() {
-  int res = countbits(1);
+  int res = int(bitCount(1));
 }
 
 void fragment_main() {
@@ -41,18 +31,10 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:5: 'countbits' : no matching overloaded function found 
-ERROR: 0:5: '=' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 void countOneBits_fd88b2() {
-  int res = countbits(1);
+  int res = int(bitCount(1));
 }
 
 void compute_main() {
@@ -64,11 +46,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:4: 'countbits' : no matching overloaded function found 
-ERROR: 0:4: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:4: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.glsl b/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.glsl
index f425bb6..d158448 100644
--- a/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/textureDimensions/ba1481.wgsl.expected.glsl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-../../src/tint/writer/glsl/generator_impl.cc:2533 internal compiler error: Multiplanar external texture transform was not run.
+../../src/tint/writer/glsl/generator_impl.cc:2553 internal compiler error: Multiplanar external texture transform was not run.
 
 
 ********************************************************************
diff --git a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl b/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl
index f425bb6..d158448 100644
--- a/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/textureLoad/8acf41.wgsl.expected.glsl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-../../src/tint/writer/glsl/generator_impl.cc:2533 internal compiler error: Multiplanar external texture transform was not run.
+../../src/tint/writer/glsl/generator_impl.cc:2553 internal compiler error: Multiplanar external texture transform was not run.
 
 
 ********************************************************************
diff --git a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl b/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl
index f425bb6..d158448 100644
--- a/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/textureSampleLevel/979816.wgsl.expected.glsl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-../../src/tint/writer/glsl/generator_impl.cc:2533 internal compiler error: Multiplanar external texture transform was not run.
+../../src/tint/writer/glsl/generator_impl.cc:2553 internal compiler error: Multiplanar external texture transform was not run.
 
 
 ********************************************************************
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_IntVector.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_IntVector.spvasm.expected.glsl
index 90d4fcd..a2b0da4 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_IntVector.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_IntVector.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  ivec2 x_1 = countbits(v2i1);
+  ivec2 x_1 = ivec2(bitCount(v2i1));
   return;
 }
 
@@ -20,11 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '=' :  cannot convert from ' const float' to ' temp highp 2-component vector of int'
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_UintVector.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_UintVector.spvasm.expected.glsl
index 0d0f715..8f0ef93 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_UintVector.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_IntVector_UintVector.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  ivec2 x_1 = ivec2(countbits(v2u1));
+  ivec2 x_1 = ivec2(uvec2(bitCount(v2u1)));
   return;
 }
 
@@ -20,10 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Int.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Int.spvasm.expected.glsl
index 14bc7ec..cef6916 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Int.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Int.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  int x_1 = countbits(i1);
+  int x_1 = int(bitCount(i1));
   return;
 }
 
@@ -20,11 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '=' :  cannot convert from ' const float' to ' temp highp int'
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Uint.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Uint.spvasm.expected.glsl
index 26c3149..3a7c14c 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Uint.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Int_Uint.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  int x_1 = int(countbits(u1));
+  int x_1 = int(uint(bitCount(u1)));
   return;
 }
 
@@ -20,10 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_IntVector.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_IntVector.spvasm.expected.glsl
index 001332f..53291e7 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_IntVector.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_IntVector.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  uvec2 x_1 = uvec2(countbits(v2i1));
+  uvec2 x_1 = uvec2(ivec2(bitCount(v2i1)));
   return;
 }
 
@@ -20,10 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_UintVector.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_UintVector.spvasm.expected.glsl
index b53a816..a6bf792 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_UintVector.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_UintVector_UintVector.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  uvec2 x_1 = countbits(v2u1);
+  uvec2 x_1 = uvec2(bitCount(v2u1));
   return;
 }
 
@@ -20,11 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '=' :  cannot convert from ' const float' to ' temp highp 2-component vector of uint'
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Int.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Int.spvasm.expected.glsl
index ed3e3e8..8c34a54 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Int.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Int.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  uint x_1 = uint(countbits(i1));
+  uint x_1 = uint(int(bitCount(i1)));
   return;
 }
 
@@ -20,10 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Uint.spvasm.expected.glsl b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Uint.spvasm.expected.glsl
index bb09555..7cbf141 100644
--- a/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Uint.spvasm.expected.glsl
+++ b/test/tint/unittest/reader/spirv/SpvUnaryBitTest_BitCount_Uint_Uint.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 void main_1() {
@@ -7,7 +5,7 @@
   int i1 = 30;
   uvec2 v2u1 = uvec2(10u, 20u);
   ivec2 v2i1 = ivec2(30, 40);
-  uint x_1 = countbits(u1);
+  uint x_1 = uint(bitCount(u1));
   return;
 }
 
@@ -20,11 +18,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:8: 'countbits' : no matching overloaded function found 
-ERROR: 0:8: '=' :  cannot convert from ' const float' to ' temp highp uint'
-ERROR: 0:8: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.glsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.glsl
index 944bf9e..311b8a6 100644
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.glsl
+++ b/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 precision mediump float;
 
@@ -39,7 +37,7 @@
   if ((x_65 > x_67)) {
     a = (a + 1);
   }
-  i = countbits(a);
+  i = int(bitCount(a));
   int x_75 = i;
   int x_77 = x_11.x_GLF_uniform_int_values[0].el;
   if ((x_75 < x_77)) {
@@ -85,11 +83,3 @@
   x_GLF_color_1_1 = inner_result.x_GLF_color_1;
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:40: 'countbits' : no matching overloaded function found 
-ERROR: 0:40: 'assign' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:40: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.glsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.glsl
index c64c3de..f834d90 100644
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.glsl
+++ b/test/tint/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl:1:13 warning: use of deprecated language feature: the @stride attribute is deprecated; use a larger type if necessary
 type Arr = @stride(16) array<f32, 1>;
             ^^^^^^
@@ -47,7 +45,7 @@
   if ((x_65 > x_67)) {
     a = (a + 1);
   }
-  i = countbits(a);
+  i = int(bitCount(a));
   int x_75 = i;
   int x_77 = x_11.x_GLF_uniform_int_values[0].el;
   if ((x_75 < x_77)) {
@@ -93,11 +91,3 @@
   x_GLF_color_1_1 = inner_result.x_GLF_color_1;
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:40: 'countbits' : no matching overloaded function found 
-ERROR: 0:40: 'assign' :  cannot convert from ' const float' to ' temp mediump int'
-ERROR: 0:40: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-