// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include #include namespace rocRoller { template <> std::shared_ptr> GetGenerator(Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Register::ValuePtr shiftAmount, Expression::AddShiftL const&) { return Component::Get>( getContextFromValues(dst, lhs, rhs, shiftAmount), dst->regType(), dst->variableType().dataType); } Generator AddShiftLGenerator::generate(Register::ValuePtr dest, Register::ValuePtr lhs, Register::ValuePtr rhs, Register::ValuePtr shiftAmount, Expression::AddShiftL const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); AssertFatal(shiftAmount != nullptr); if(dest->regType() == Register::Type::Vector && (dest->variableType() == DataType::UInt32 || dest->variableType() == DataType::Int32)) { auto toShift = shiftAmount->regType() == Register::Type::Literal ? shiftAmount : shiftAmount->subset({0}); co_yield_(Instruction("v_add_lshl_u32", {dest}, {lhs, rhs, toShift}, {}, "")); } else { co_yield generateOp(dest, lhs, rhs); co_yield generateOp(dest, dest, shiftAmount); } } }