aboutsummaryrefslogtreecommitdiff
path: root/heavy_optimizer/riscv64/inline_intrinsic.h
diff options
context:
space:
mode:
Diffstat (limited to 'heavy_optimizer/riscv64/inline_intrinsic.h')
-rw-r--r--heavy_optimizer/riscv64/inline_intrinsic.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/heavy_optimizer/riscv64/inline_intrinsic.h b/heavy_optimizer/riscv64/inline_intrinsic.h
index 3d0f8162..f4664893 100644
--- a/heavy_optimizer/riscv64/inline_intrinsic.h
+++ b/heavy_optimizer/riscv64/inline_intrinsic.h
@@ -447,6 +447,14 @@ class TryBindingBasedInlineIntrinsicForHeavyOptimizer {
static_assert(std::is_same_v<Usage, intrinsics::bindings::UseDef>);
return std::tuple{std::get<arg_info.from>(input_args_)};
}
+ } else if constexpr (arg_info.arg_type == ArgInfo::OUT_TMP_ARG) {
+ if constexpr (kNumOut > 1) {
+ static_assert(kDependentTypeFalse<ArgTraits<ArgBinding>>);
+ } else {
+ CHECK(implicit_result_reg_.IsInvalidReg());
+ implicit_result_reg_ = AllocVReg();
+ return std::tuple{implicit_result_reg_};
+ }
} else if constexpr (arg_info.arg_type == ArgInfo::OUT_ARG) {
static_assert(!std::is_same_v<ResType, std::monostate>);
static_assert(std::is_same_v<Usage, intrinsics::bindings::Def> ||
@@ -545,7 +553,8 @@ class TryBindingBasedInlineIntrinsicForHeavyOptimizer {
CHECK(!xmm_result_reg_.IsInvalidReg());
MovToResult<RegisterClass>(builder_, result_, xmm_result_reg_);
} else if constexpr ((arg_info.arg_type == ArgInfo::OUT_ARG ||
- arg_info.arg_type == ArgInfo::IN_OUT_TMP_ARG) &&
+ arg_info.arg_type == ArgInfo::IN_OUT_TMP_ARG ||
+ arg_info.arg_type == ArgInfo::OUT_TMP_ARG) &&
RegisterClass::kIsImplicitReg) {
CHECK(!implicit_result_reg_.IsInvalidReg());
MovToResult<RegisterClass>(builder_, result_, implicit_result_reg_);