Files
clang-p2996/mlir/lib/Target/LLVMIR/Dialect/ArmSME/ArmSMEToLLVMIRTranslation.cpp
Andrzej Warzynski 8d6d4f8321 [mlir][ArmSME] Split the Op definition (nfc) (#67985)
Move the definitions of LLVM intrinsic Ops for ArmSME into a dedicated
file. To facilitate this, the dialect definition together with various
shared definitions are moved to ArmSME.td.

This change will allow us to refactor the ArmSME dialect documentation.
In particular, we will be able to categorise the Ops into "regular"  and
"intrinsic" ops. Also, it will be easier to add some custom
documentation as opposed to relying on auto-generated docs that simply
list the available Ops.

The documentation will be updated in a forthcoming patch. Only
non-functional changes.
2023-10-04 14:59:00 +00:00

58 lines
2.1 KiB
C++

//======- ArmSMEToLLVMIRTranslation.cpp - Translate ArmSME to LLVM IR -=======//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements a translation between the ArmSME dialect and LLVM IR.
//
//===----------------------------------------------------------------------===//
#include "mlir/Target/LLVMIR/Dialect/ArmSME/ArmSMEToLLVMIRTranslation.h"
#include "mlir/Dialect/ArmSME/IR/ArmSME.h"
#include "mlir/IR/Operation.h"
#include "mlir/Target/LLVMIR/ModuleTranslation.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/IntrinsicsAArch64.h"
using namespace mlir;
using namespace mlir::LLVM;
namespace {
/// Implementation of the dialect interface that converts operations belonging
/// to the ArmSME dialect to LLVM IR.
class ArmSMEDialectLLVMIRTranslationInterface
: public LLVMTranslationDialectInterface {
public:
using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface;
/// Translates the given operation to LLVM IR using the provided IR builder
/// and saving the state in `moduleTranslation`.
LogicalResult
convertOperation(Operation *op, llvm::IRBuilderBase &builder,
LLVM::ModuleTranslation &moduleTranslation) const final {
Operation &opInst = *op;
#include "mlir/Dialect/ArmSME/IR/ArmSMEIntrinsicConversions.inc"
#include "mlir/Dialect/ArmSME/IR/ArmSMEOpsConversions.inc"
return failure();
}
};
} // namespace
void mlir::registerArmSMEDialectTranslation(DialectRegistry &registry) {
registry.insert<arm_sme::ArmSMEDialect>();
registry.addExtension(+[](MLIRContext *ctx, arm_sme::ArmSMEDialect *dialect) {
dialect->addInterfaces<ArmSMEDialectLLVMIRTranslationInterface>();
});
}
void mlir::registerArmSMEDialectTranslation(MLIRContext &context) {
DialectRegistry registry;
registerArmSMEDialectTranslation(registry);
context.appendDialectRegistry(registry);
}