// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include #include #include namespace rocRoller { template <> std::shared_ptr> GetGenerator(Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { // Choose the proper generator, based on the context, register type // and datatype. return Component::Get>( getContextFromValues(dst, lhs, rhs), promoteRegisterType(nullptr, lhs, rhs), promoteDataType(nullptr, lhs, rhs)); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); if(dst != nullptr && !dst->isSCC()) { co_yield(Instruction::Lock(Scheduling::Dependency::SCC, "Start Compare writing to non-SCC dest")); } co_yield_(Instruction("s_cmp_le_i32", {}, {lhs, rhs}, {}, "")); if(dst != nullptr && !dst->isSCC()) { co_yield m_context->copier()->copy(dst, m_context->getSCC(), ""); co_yield(Instruction::Unlock("End Compare writing to non-SCC dest")); } } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); if(dst != nullptr && !dst->isSCC()) { co_yield(Instruction::Lock(Scheduling::Dependency::SCC, "Start Compare writing to non-SCC dest")); } co_yield_(Instruction("s_cmp_le_u32", {}, {lhs, rhs}, {}, "")); if(dst != nullptr && !dst->isSCC()) { co_yield m_context->copier()->copy(dst, m_context->getSCC(), ""); co_yield(Instruction::Unlock("End Compare writing to non-SCC dest")); } } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield_(Instruction("v_cmp_le_i32", {dst}, {lhs, rhs}, {}, "")); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield_(Instruction("v_cmp_le_u32", {dst}, {lhs, rhs}, {}, "")); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield scalarCompareThroughVALU("v_cmp_le_i64", dst, lhs, rhs); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield scalarCompareThroughVALU("v_cmp_le_u64", dst, lhs, rhs); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield_(Instruction("v_cmp_le_i64", {dst}, {lhs, rhs}, {}, "")); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield_(Instruction("v_cmp_le_u64", {dst}, {lhs, rhs}, {}, "")); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield_(Instruction("v_cmp_le_f32", {dst}, {lhs, rhs}, {}, "")); } template <> Generator LessThanEqualGenerator::generate( Register::ValuePtr dst, Register::ValuePtr lhs, Register::ValuePtr rhs, Expression::LessThanEqual const&) { AssertFatal(lhs != nullptr); AssertFatal(rhs != nullptr); co_yield_(Instruction("v_cmp_le_f64", {dst}, {lhs, rhs}, {}, "")); } }