[msl] Add MSL subclass of MemberBuiltinCall
Test will be added when there is a member function intrinsic.
Bug: 42251016
Change-Id: I2dc1fce11a4af84e40bbdf205f4ee1359f2e0b07
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/192304
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/core/ir/builder.h b/src/tint/lang/core/ir/builder.h
index faae146..f85ec01 100644
--- a/src/tint/lang/core/ir/builder.h
+++ b/src/tint/lang/core/ir/builder.h
@@ -55,6 +55,7 @@
#include "src/tint/lang/core/ir/load.h"
#include "src/tint/lang/core/ir/load_vector_element.h"
#include "src/tint/lang/core/ir/loop.h"
+#include "src/tint/lang/core/ir/member_builtin_call.h"
#include "src/tint/lang/core/ir/module.h"
#include "src/tint/lang/core/ir/multi_in_block.h"
#include "src/tint/lang/core/ir/next_iteration.h"
@@ -1063,6 +1064,33 @@
Values(std::forward<ARGS>(args)...));
}
+ /// Creates a member builtin call instruction with an existing instruction result.
+ /// @param result the instruction result to use
+ /// @param func the builtin function to call
+ /// @param obj the object
+ /// @param args the call arguments
+ /// @returns the instruction
+ template <typename KLASS, typename FUNC, typename OBJ, typename... ARGS>
+ tint::traits::EnableIf<tint::traits::IsTypeOrDerived<KLASS, ir::MemberBuiltinCall>, KLASS*>
+ MemberCallWithResult(ir::InstructionResult* result, FUNC func, OBJ&& obj, ARGS&&... args) {
+ return Append(ir.allocators.instructions.Create<KLASS>(
+ result, func, Value(std::forward<OBJ>(obj)), Values(std::forward<ARGS>(args)...)));
+ }
+
+ /// Creates a member builtin call instruction.
+ /// @param type the return type of the call
+ /// @param func the builtin function to call
+ /// @param obj the object
+ /// @param args the call arguments
+ /// @returns the instruction
+ template <typename KLASS, typename FUNC, typename OBJ, typename... ARGS>
+ tint::traits::EnableIf<tint::traits::IsTypeOrDerived<KLASS, ir::MemberBuiltinCall>, KLASS*>
+ MemberCall(const core::type::Type* type, FUNC func, OBJ&& obj, ARGS&&... args) {
+ return MemberCallWithResult<KLASS>(InstructionResult(type), func,
+ Value(std::forward<OBJ>(obj)),
+ Values(std::forward<ARGS>(args)...));
+ }
+
/// Creates a value conversion instruction to the template type T
/// @param val the value to be converted
/// @returns the instruction
diff --git a/src/tint/lang/msl/ir/BUILD.bazel b/src/tint/lang/msl/ir/BUILD.bazel
index d7f52b8..a4afc1f 100644
--- a/src/tint/lang/msl/ir/BUILD.bazel
+++ b/src/tint/lang/msl/ir/BUILD.bazel
@@ -40,10 +40,12 @@
name = "ir",
srcs = [
"builtin_call.cc",
+ "member_builtin_call.cc",
"memory_order.cc",
],
hdrs = [
"builtin_call.h",
+ "member_builtin_call.h",
"memory_order.h",
],
deps = [
diff --git a/src/tint/lang/msl/ir/BUILD.cmake b/src/tint/lang/msl/ir/BUILD.cmake
index 1ff9a0c..872daf1 100644
--- a/src/tint/lang/msl/ir/BUILD.cmake
+++ b/src/tint/lang/msl/ir/BUILD.cmake
@@ -41,6 +41,8 @@
tint_add_target(tint_lang_msl_ir lib
lang/msl/ir/builtin_call.cc
lang/msl/ir/builtin_call.h
+ lang/msl/ir/member_builtin_call.cc
+ lang/msl/ir/member_builtin_call.h
lang/msl/ir/memory_order.cc
lang/msl/ir/memory_order.h
)
diff --git a/src/tint/lang/msl/ir/BUILD.gn b/src/tint/lang/msl/ir/BUILD.gn
index 21fb844..53b4f67 100644
--- a/src/tint/lang/msl/ir/BUILD.gn
+++ b/src/tint/lang/msl/ir/BUILD.gn
@@ -46,6 +46,8 @@
sources = [
"builtin_call.cc",
"builtin_call.h",
+ "member_builtin_call.cc",
+ "member_builtin_call.h",
"memory_order.cc",
"memory_order.h",
]
diff --git a/src/tint/lang/msl/ir/member_builtin_call.cc b/src/tint/lang/msl/ir/member_builtin_call.cc
new file mode 100644
index 0000000..0f2ca6d
--- /dev/null
+++ b/src/tint/lang/msl/ir/member_builtin_call.cc
@@ -0,0 +1,63 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "src/tint/lang/msl/ir/member_builtin_call.h"
+
+#include <utility>
+
+#include "src/tint/lang/core/ir/clone_context.h"
+#include "src/tint/lang/core/ir/instruction_result.h"
+#include "src/tint/lang/core/ir/module.h"
+#include "src/tint/lang/core/ir/value.h"
+#include "src/tint/lang/msl/builtin_fn.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/ice/ice.h"
+#include "src/tint/utils/rtti/castable.h"
+
+TINT_INSTANTIATE_TYPEINFO(tint::msl::ir::MemberBuiltinCall);
+
+namespace tint::msl::ir {
+
+MemberBuiltinCall::MemberBuiltinCall(core::ir::InstructionResult* result,
+ BuiltinFn func,
+ core::ir::Value* object,
+ VectorRef<core::ir::Value*> arguments)
+ : Base(result, object, arguments), func_(func) {
+ TINT_ASSERT(func != BuiltinFn::kNone);
+}
+
+MemberBuiltinCall::~MemberBuiltinCall() = default;
+
+MemberBuiltinCall* MemberBuiltinCall::Clone(core::ir::CloneContext& ctx) {
+ auto* new_result = ctx.Clone(Result(0));
+ auto* new_object = ctx.Clone(Object());
+ auto new_args = ctx.Clone<MemberBuiltinCall::kDefaultNumOperands>(Args());
+ return ctx.ir.allocators.instructions.Create<MemberBuiltinCall>(new_result, func_, new_object,
+ std::move(new_args));
+}
+
+} // namespace tint::msl::ir
diff --git a/src/tint/lang/msl/ir/member_builtin_call.h b/src/tint/lang/msl/ir/member_builtin_call.h
new file mode 100644
index 0000000..6caa835
--- /dev/null
+++ b/src/tint/lang/msl/ir/member_builtin_call.h
@@ -0,0 +1,78 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef SRC_TINT_LANG_MSL_IR_MEMBER_BUILTIN_CALL_H_
+#define SRC_TINT_LANG_MSL_IR_MEMBER_BUILTIN_CALL_H_
+
+#include <string>
+
+#include "src/tint/lang/core/intrinsic/table_data.h"
+#include "src/tint/lang/core/ir/member_builtin_call.h"
+#include "src/tint/lang/msl/builtin_fn.h"
+#include "src/tint/lang/msl/intrinsic/dialect.h"
+#include "src/tint/utils/rtti/castable.h"
+
+namespace tint::msl::ir {
+
+/// An MSL member builtin call instruction in the IR.
+class MemberBuiltinCall final : public Castable<MemberBuiltinCall, core::ir::MemberBuiltinCall> {
+ public:
+ /// Constructor
+ /// @param result the result value
+ /// @param func the builtin function
+ /// @param object the object
+ /// @param args the call arguments
+ MemberBuiltinCall(core::ir::InstructionResult* result,
+ BuiltinFn func,
+ core::ir::Value* object,
+ VectorRef<core::ir::Value*> args = tint::Empty);
+ ~MemberBuiltinCall() override;
+
+ /// @copydoc core::ir::Instruction::Clone()
+ MemberBuiltinCall* Clone(core::ir::CloneContext& ctx) override;
+
+ /// @returns the builtin function
+ BuiltinFn Func() const { return func_; }
+
+ /// @returns the identifier for the function
+ size_t FuncId() const override { return static_cast<size_t>(func_); }
+
+ /// @returns the friendly name for the instruction
+ std::string FriendlyName() const override { return str(func_); }
+
+ /// @returns the table data to validate this builtin
+ const core::intrinsic::TableData& TableData() const override {
+ return msl::intrinsic::Dialect::kData;
+ }
+
+ private:
+ BuiltinFn func_;
+};
+
+} // namespace tint::msl::ir
+
+#endif // SRC_TINT_LANG_MSL_IR_MEMBER_BUILTIN_CALL_H_