[tint] Add basic IR support for u64

Bug: 394291739
Change-Id: I2f4d96b931273c870e98a38e3f3aa86921146fbe
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/224598
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/core/fluent_types.h b/src/tint/lang/core/fluent_types.h
index 2e97287..3ea4c43 100644
--- a/src/tint/lang/core/fluent_types.h
+++ b/src/tint/lang/core/fluent_types.h
@@ -41,6 +41,7 @@
 using i32 = tint::core::i32;
 using i8 = tint::core::i8;
 using u32 = tint::core::u32;
+using u64 = tint::core::u64;
 using u8 = tint::core::u8;
 using AFloat = tint::core::AFloat;
 using AInt = tint::core::AInt;
diff --git a/src/tint/lang/core/ir/builder.h b/src/tint/lang/core/ir/builder.h
index 03a0f21..a10d226 100644
--- a/src/tint/lang/core/ir/builder.h
+++ b/src/tint/lang/core/ir/builder.h
@@ -82,6 +82,7 @@
 #include "src/tint/lang/core/type/pointer.h"  // IWYU pragma: export
 #include "src/tint/lang/core/type/type.h"     // IWYU pragma: export
 #include "src/tint/lang/core/type/u32.h"      // IWYU pragma: export
+#include "src/tint/lang/core/type/u64.h"      // IWYU pragma: export
 #include "src/tint/lang/core/type/u8.h"       // IWYU pragma: export
 #include "src/tint/lang/core/type/vector.h"
 #include "src/tint/lang/core/type/void.h"  // IWYU pragma: export
@@ -366,6 +367,11 @@
     /// @returns the new constant
     ir::Constant* Constant(core::u32 v) { return Constant(ConstantValue(v)); }
 
+    /// Creates a ir::Constant for a u64 Scalar
+    /// @param v the value
+    /// @returns the new constant
+    ir::Constant* Constant(core::u64 v) { return Constant(ConstantValue(v)); }
+
     /// Creates a ir::Constant for a u8 Scalar
     /// @param v the value
     /// @returns the new constant
@@ -413,6 +419,11 @@
     /// @returns the new constant
     const core::constant::Value* ConstantValue(core::u32 v) { return ir.constant_values.Get(v); }
 
+    /// Creates a core::constant::Value for a u64 Scalar
+    /// @param v the value
+    /// @returns the new constant
+    const core::constant::Value* ConstantValue(core::u64 v) { return ir.constant_values.Get(v); }
+
     /// Creates a core::constant::Value for a u8 Scalar
     /// @param v the value
     /// @returns the new constant
diff --git a/src/tint/lang/core/ir/constant_test.cc b/src/tint/lang/core/ir/constant_test.cc
index c4a55bd..11c3acc 100644
--- a/src/tint/lang/core/ir/constant_test.cc
+++ b/src/tint/lang/core/ir/constant_test.cc
@@ -106,6 +106,22 @@
     EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<bool>>());
 }
 
+TEST_F(IR_ConstantTest, u64) {
+    StringStream str;
+
+    auto* c = b.Constant(u64(2));
+    EXPECT_EQ(u64(2), c->Value()->As<core::constant::Scalar<u64>>()->ValueAs<u64>());
+
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<f32>>());
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<f16>>());
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<i32>>());
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<i8>>());
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<u32>>());
+    EXPECT_TRUE(c->Value()->Is<core::constant::Scalar<u64>>());
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<u8>>());
+    EXPECT_FALSE(c->Value()->Is<core::constant::Scalar<bool>>());
+}
+
 TEST_F(IR_ConstantTest, u8) {
     StringStream str;
 
diff --git a/src/tint/lang/core/ir/disassembler.cc b/src/tint/lang/core/ir/disassembler.cc
index ed30b14..bf38b78 100644
--- a/src/tint/lang/core/ir/disassembler.cc
+++ b/src/tint/lang/core/ir/disassembler.cc
@@ -424,6 +424,9 @@
                         [&](const core::constant::Scalar<u32>* scalar) {
                             out_ << StyleLiteral(scalar->ValueAs<u32>().value, "u");
                         },
+                        [&](const core::constant::Scalar<u64>* scalar) {
+                            out_ << StyleLiteral(scalar->ValueAs<u64>().value, "u64");
+                        },
                         [&](const core::constant::Scalar<u8>* scalar) {
                             out_ << StyleLiteral(u32(scalar->ValueAs<u8>().value), "u8");
                         },
diff --git a/src/tint/lang/core/type/type.cc b/src/tint/lang/core/type/type.cc
index 10ef6a5..ce22293 100644
--- a/src/tint/lang/core/type/type.cc
+++ b/src/tint/lang/core/type/type.cc
@@ -42,6 +42,7 @@
 #include "src/tint/lang/core/type/struct.h"
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/lang/core/type/u32.h"
+#include "src/tint/lang/core/type/u64.h"
 #include "src/tint/lang/core/type/u8.h"
 #include "src/tint/lang/core/type/vector.h"
 #include "src/tint/utils/rtti/switch.h"
@@ -111,7 +112,7 @@
 }
 
 bool Type::IsIntegerScalar() const {
-    return IsAnyOf<U32, I32, U8, I8>();
+    return IsAnyOf<U32, I32, U64, U8, I8>();
 }
 
 bool Type::IsIntegerVector() const {
@@ -119,27 +120,27 @@
 }
 
 bool Type::IsSignedIntegerScalar() const {
-    return IsAnyOf<I32, AbstractInt>();
+    return IsAnyOf<I32, I8, AbstractInt>();
 }
 
 bool Type::IsUnsignedIntegerScalar() const {
-    return Is<U32>();
+    return IsAnyOf<U32, U64, U8>();
 }
 
 bool Type::IsSignedIntegerVector() const {
-    return Is([](const Vector* v) { return v->Type()->IsAnyOf<I32, AbstractInt>(); });
+    return Is([](const Vector* v) { return v->Type()->IsSignedIntegerScalar(); });
 }
 
 bool Type::IsUnsignedIntegerVector() const {
-    return Is([](const Vector* v) { return v->Type()->Is<U32>(); });
+    return Is([](const Vector* v) { return v->Type()->IsUnsignedIntegerScalar(); });
 }
 
 bool Type::IsUnsignedIntegerScalarOrVector() const {
-    return Is<U32>() || IsUnsignedIntegerVector();
+    return IsUnsignedIntegerScalar() || IsUnsignedIntegerVector();
 }
 
 bool Type::IsSignedIntegerScalarOrVector() const {
-    return IsAnyOf<I32, AbstractInt>() || IsSignedIntegerVector();
+    return IsSignedIntegerScalar() || IsSignedIntegerVector();
 }
 
 bool Type::IsIntegerScalarOrVector() const {