[msl-writer][hlsl-writer] Add countOneBits and reverseBits

This Cl adds countOneBits and reverseBits intrinsic support to the MSL
and HLSL backends.

Bug: tint:250
Change-Id: Idb572da32e9c10767a27326cacf58aafef44a77a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/29401
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 2b54bac..86eef79 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -473,18 +473,12 @@
   if (intrinsic == ast::Intrinsic::kAll) {
     return "all";
   }
+  if (intrinsic == ast::Intrinsic::kCountOneBits) {
+    return "countbits";
+  }
   if (intrinsic == ast::Intrinsic::kDot) {
     return "dot";
   }
-  if (intrinsic == ast::Intrinsic::kIsFinite) {
-    return "isfinite";
-  }
-  if (intrinsic == ast::Intrinsic::kIsInf) {
-    return "isinf";
-  }
-  if (intrinsic == ast::Intrinsic::kIsNan) {
-    return "isnan";
-  }
   if (intrinsic == ast::Intrinsic::kDpdy) {
     return "ddy";
   }
@@ -508,6 +502,18 @@
       intrinsic == ast::Intrinsic::kFwidthCoarse) {
     return "fwidth";
   }
+  if (intrinsic == ast::Intrinsic::kIsFinite) {
+    return "isfinite";
+  }
+  if (intrinsic == ast::Intrinsic::kIsInf) {
+    return "isinf";
+  }
+  if (intrinsic == ast::Intrinsic::kIsNan) {
+    return "isnan";
+  }
+  if (intrinsic == ast::Intrinsic::kReverseBits) {
+    return "reversebits";
+  }
   return "";
 }
 
diff --git a/src/writer/hlsl/generator_impl_intrinsic_test.cc b/src/writer/hlsl/generator_impl_intrinsic_test.cc
index 8b46c7f..7860c75 100644
--- a/src/writer/hlsl/generator_impl_intrinsic_test.cc
+++ b/src/writer/hlsl/generator_impl_intrinsic_test.cc
@@ -46,6 +46,7 @@
     HlslIntrinsicTest,
     testing::Values(IntrinsicData{ast::Intrinsic::kAny, "any"},
                     IntrinsicData{ast::Intrinsic::kAll, "all"},
+                    IntrinsicData{ast::Intrinsic::kCountOneBits, "countbits"},
                     IntrinsicData{ast::Intrinsic::kDot, "dot"},
                     IntrinsicData{ast::Intrinsic::kDpdx, "ddx"},
                     IntrinsicData{ast::Intrinsic::kDpdxCoarse, "ddx_coarse"},
@@ -58,7 +59,9 @@
                     IntrinsicData{ast::Intrinsic::kFwidthFine, "fwidth"},
                     IntrinsicData{ast::Intrinsic::kIsFinite, "isfinite"},
                     IntrinsicData{ast::Intrinsic::kIsInf, "isinf"},
-                    IntrinsicData{ast::Intrinsic::kIsNan, "isnan"}));
+                    IntrinsicData{ast::Intrinsic::kIsNan, "isnan"},
+                    IntrinsicData{ast::Intrinsic::kReverseBits,
+                                  "reversebits"}));
 
 TEST_F(HlslGeneratorImplTest_Intrinsic, DISABLED_Intrinsic_IsNormal) {
   FAIL();
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index cd92b1c..be20cdf 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -413,24 +413,12 @@
   if (intrinsic == ast::Intrinsic::kAll) {
     return "all";
   }
+  if (intrinsic == ast::Intrinsic::kCountOneBits) {
+    return "popcount";
+  }
   if (intrinsic == ast::Intrinsic::kDot) {
     return "dot";
   }
-  if (intrinsic == ast::Intrinsic::kIsFinite) {
-    return "isfinite";
-  }
-  if (intrinsic == ast::Intrinsic::kIsInf) {
-    return "isinf";
-  }
-  if (intrinsic == ast::Intrinsic::kIsNan) {
-    return "isnan";
-  }
-  if (intrinsic == ast::Intrinsic::kIsNormal) {
-    return "isnormal";
-  }
-  if (intrinsic == ast::Intrinsic::kSelect) {
-    return "select";
-  }
   if (intrinsic == ast::Intrinsic::kDpdy ||
       intrinsic == ast::Intrinsic::kDpdyFine ||
       intrinsic == ast::Intrinsic::kDpdyCoarse) {
@@ -446,6 +434,24 @@
       intrinsic == ast::Intrinsic::kFwidthCoarse) {
     return "fwidth";
   }
+  if (intrinsic == ast::Intrinsic::kIsFinite) {
+    return "isfinite";
+  }
+  if (intrinsic == ast::Intrinsic::kIsInf) {
+    return "isinf";
+  }
+  if (intrinsic == ast::Intrinsic::kIsNan) {
+    return "isnan";
+  }
+  if (intrinsic == ast::Intrinsic::kIsNormal) {
+    return "isnormal";
+  }
+  if (intrinsic == ast::Intrinsic::kReverseBits) {
+    return "reverse_bits";
+  }
+  if (intrinsic == ast::Intrinsic::kSelect) {
+    return "select";
+  }
   return "";
 }
 
diff --git a/src/writer/msl/generator_impl_intrinsic_test.cc b/src/writer/msl/generator_impl_intrinsic_test.cc
index ed09571..9378229 100644
--- a/src/writer/msl/generator_impl_intrinsic_test.cc
+++ b/src/writer/msl/generator_impl_intrinsic_test.cc
@@ -50,6 +50,7 @@
     MslIntrinsicTest,
     testing::Values(IntrinsicData{ast::Intrinsic::kAny, "any"},
                     IntrinsicData{ast::Intrinsic::kAll, "all"},
+                    IntrinsicData{ast::Intrinsic::kCountOneBits, "popcount"},
                     IntrinsicData{ast::Intrinsic::kDot, "dot"},
                     IntrinsicData{ast::Intrinsic::kDpdx, "dfdx"},
                     IntrinsicData{ast::Intrinsic::kDpdxCoarse, "dfdx"},
@@ -64,6 +65,7 @@
                     IntrinsicData{ast::Intrinsic::kIsInf, "isinf"},
                     IntrinsicData{ast::Intrinsic::kIsNan, "isnan"},
                     IntrinsicData{ast::Intrinsic::kIsNormal, "isnormal"},
+                    IntrinsicData{ast::Intrinsic::kReverseBits, "reverse_bits"},
                     IntrinsicData{ast::Intrinsic::kSelect, "select"}));
 
 TEST_F(MslGeneratorImplTest, DISABLED_Intrinsic_OuterProduct) {