* Copyright (c) 2025 Huawei Technologies Co., Ltd.
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
* CANN Open Software License Agreement Version 2.0 (the "License").
* Please refer to the License for details. You may not use this file except in compliance with the License.
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
* See LICENSE in the root of the software repository for the full text of the License.
*/
#include "ascir/Target/Asc/External/Math.h"
using namespace mlir;
LogicalResult mlir::printOperation(CodeEmitter& emitter, math::FmaOp op)
{
FAIL_OR(isScalarOperation(op));
FAIL_OR(emitter.emitAssignPrefix(*op.getOperation()));
auto& os = emitter.ostream();
auto lhs = emitter.getOrCreateName(op.getOperand(0));
auto mhs = emitter.getOrCreateName(op.getOperand(1));
auto rhs = emitter.getOrCreateName(op.getOperand(2));
os << lhs << " * " << mhs << " + " << rhs;
return success();
}
LogicalResult mlir::printOperation(CodeEmitter& emitter, math::CopySignOp op)
{
FAIL_OR(isScalarOperation(op));
FAIL_OR(emitter.emitAssignPrefix(*op.getOperation()));
auto lhs = emitter.getOrCreateName(op.getLhs());
auto rhs = emitter.getOrCreateName(op.getRhs());
auto expression = formatv("(({0} < 0 && {1} > 0) || ({0} > 0 && {1} < 0)) ? -{0} : {0}", lhs, rhs);
emitter.ostream() << expression;
return success();
}