diff options
Diffstat (limited to 'heavy_optimizer/riscv64/inline_intrinsic.h')
-rw-r--r-- | heavy_optimizer/riscv64/inline_intrinsic.h | 11 |
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_); |