// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include namespace rocRoller { namespace Expression { struct SplitConcatenateVisitor { std::vector operator()(CommandArgumentValue const& value) const { return std::visit( [](auto const& val) -> std::vector { using T = std::decay_t; if constexpr(std::is_same_v) { // Split uint64_t into two Raw32 values (low 32 bits, then high 32 bits) uint32_t low = static_cast(val); uint32_t high = static_cast((val >> 32)); return {literal(Raw32(low)), literal(Raw32(high))}; } else { return {literal(val)}; } }, value); } template std::vector operator()(Expr const& expr) const { return {std::make_shared(expr)}; } std::vector call(ExpressionPtr expr) const { if(!expr) return {expr}; return std::visit(*this, *expr); } }; /** * Splits uint64_t literal operands in a Concatenate expression into two Raw32 operands. */ Concatenate splitConcatenate(Concatenate const& expr) { Concatenate cpy = expr; std::vector operands; auto const visitor = SplitConcatenateVisitor(); for(auto const& operand : expr.operands) { auto split = visitor.call(operand); operands.insert(operands.end(), split.begin(), split.end()); } cpy.operands = std::move(operands); return cpy; } } }