[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 {