1b739badaSJavier Setoain //===- LegalizeForLLVMExport.cpp - Prepare ArmSVE for LLVM translation ----===//
2b739badaSJavier Setoain //
3b739badaSJavier Setoain // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b739badaSJavier Setoain // See https://llvm.org/LICENSE.txt for license information.
5b739badaSJavier Setoain // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b739badaSJavier Setoain //
7b739badaSJavier Setoain //===----------------------------------------------------------------------===//
8b739badaSJavier Setoain 
975e5f0aaSAlex Zinenko #include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
1075e5f0aaSAlex Zinenko #include "mlir/Conversion/LLVMCommon/Pattern.h"
11b739badaSJavier Setoain #include "mlir/Dialect/ArmSVE/ArmSVEDialect.h"
12b739badaSJavier Setoain #include "mlir/Dialect/ArmSVE/Transforms.h"
13*1f971e23SRiver Riddle #include "mlir/Dialect/Func/IR/FuncOps.h"
14b739badaSJavier Setoain #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
15b739badaSJavier Setoain #include "mlir/IR/BuiltinOps.h"
16b739badaSJavier Setoain #include "mlir/IR/PatternMatch.h"
17b739badaSJavier Setoain 
18b739badaSJavier Setoain using namespace mlir;
19b739badaSJavier Setoain using namespace mlir::arm_sve;
20b739badaSJavier Setoain 
21b739badaSJavier Setoain template <typename OpTy>
22b739badaSJavier Setoain class ForwardOperands : public OpConversionPattern<OpTy> {
23b739badaSJavier Setoain   using OpConversionPattern<OpTy>::OpConversionPattern;
24b739badaSJavier Setoain 
25b739badaSJavier Setoain   LogicalResult
matchAndRewrite(OpTy op,typename OpTy::Adaptor adaptor,ConversionPatternRewriter & rewriter) const26b54c724bSRiver Riddle   matchAndRewrite(OpTy op, typename OpTy::Adaptor adaptor,
27b739badaSJavier Setoain                   ConversionPatternRewriter &rewriter) const final {
28b54c724bSRiver Riddle     if (adaptor.getOperands().getTypes() == op->getOperands().getTypes())
29b739badaSJavier Setoain       return rewriter.notifyMatchFailure(op, "operand types already match");
30b739badaSJavier Setoain 
31b54c724bSRiver Riddle     rewriter.updateRootInPlace(
32b54c724bSRiver Riddle         op, [&]() { op->setOperands(adaptor.getOperands()); });
33b739badaSJavier Setoain     return success();
34b739badaSJavier Setoain   }
35b739badaSJavier Setoain };
36b739badaSJavier Setoain 
37b739badaSJavier Setoain using SdotOpLowering = OneToOneConvertToLLVMPattern<SdotOp, SdotIntrOp>;
38b739badaSJavier Setoain using SmmlaOpLowering = OneToOneConvertToLLVMPattern<SmmlaOp, SmmlaIntrOp>;
39b739badaSJavier Setoain using UdotOpLowering = OneToOneConvertToLLVMPattern<UdotOp, UdotIntrOp>;
40b739badaSJavier Setoain using UmmlaOpLowering = OneToOneConvertToLLVMPattern<UmmlaOp, UmmlaIntrOp>;
4195861216SJavier Setoain using ScalableMaskedAddIOpLowering =
4295861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedAddIOp,
4395861216SJavier Setoain                                  ScalableMaskedAddIIntrOp>;
4495861216SJavier Setoain using ScalableMaskedAddFOpLowering =
4595861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedAddFOp,
4695861216SJavier Setoain                                  ScalableMaskedAddFIntrOp>;
4795861216SJavier Setoain using ScalableMaskedSubIOpLowering =
4895861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedSubIOp,
4995861216SJavier Setoain                                  ScalableMaskedSubIIntrOp>;
5095861216SJavier Setoain using ScalableMaskedSubFOpLowering =
5195861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedSubFOp,
5295861216SJavier Setoain                                  ScalableMaskedSubFIntrOp>;
5395861216SJavier Setoain using ScalableMaskedMulIOpLowering =
5495861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedMulIOp,
5595861216SJavier Setoain                                  ScalableMaskedMulIIntrOp>;
5695861216SJavier Setoain using ScalableMaskedMulFOpLowering =
5795861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedMulFOp,
5895861216SJavier Setoain                                  ScalableMaskedMulFIntrOp>;
5995861216SJavier Setoain using ScalableMaskedSDivIOpLowering =
6095861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedSDivIOp,
6195861216SJavier Setoain                                  ScalableMaskedSDivIIntrOp>;
6295861216SJavier Setoain using ScalableMaskedUDivIOpLowering =
6395861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedUDivIOp,
6495861216SJavier Setoain                                  ScalableMaskedUDivIIntrOp>;
6595861216SJavier Setoain using ScalableMaskedDivFOpLowering =
6695861216SJavier Setoain     OneToOneConvertToLLVMPattern<ScalableMaskedDivFOp,
6795861216SJavier Setoain                                  ScalableMaskedDivFIntrOp>;
68b739badaSJavier Setoain 
69b739badaSJavier Setoain /// Populate the given list with patterns that convert from ArmSVE to LLVM.
populateArmSVELegalizeForLLVMExportPatterns(LLVMTypeConverter & converter,RewritePatternSet & patterns)70b739badaSJavier Setoain void mlir::populateArmSVELegalizeForLLVMExportPatterns(
719f85c198SRiver Riddle     LLVMTypeConverter &converter, RewritePatternSet &patterns) {
72b739badaSJavier Setoain   // Populate conversion patterns
73b739badaSJavier Setoain 
74b739badaSJavier Setoain   // clang-format off
7523aa5a74SRiver Riddle   patterns.add<ForwardOperands<func::CallOp>,
7623aa5a74SRiver Riddle                ForwardOperands<func::CallIndirectOp>,
7723aa5a74SRiver Riddle                ForwardOperands<func::ReturnOp>>(converter,
78b739badaSJavier Setoain                                           &converter.getContext());
79b739badaSJavier Setoain   patterns.add<SdotOpLowering,
80b739badaSJavier Setoain                SmmlaOpLowering,
81b739badaSJavier Setoain                UdotOpLowering,
82b739badaSJavier Setoain                UmmlaOpLowering,
8395861216SJavier Setoain                ScalableMaskedAddIOpLowering,
8495861216SJavier Setoain                ScalableMaskedAddFOpLowering,
8595861216SJavier Setoain                ScalableMaskedSubIOpLowering,
8695861216SJavier Setoain                ScalableMaskedSubFOpLowering,
8795861216SJavier Setoain                ScalableMaskedMulIOpLowering,
8895861216SJavier Setoain                ScalableMaskedMulFOpLowering,
8995861216SJavier Setoain                ScalableMaskedSDivIOpLowering,
9095861216SJavier Setoain                ScalableMaskedUDivIOpLowering,
9195861216SJavier Setoain                ScalableMaskedDivFOpLowering>(converter);
92b739badaSJavier Setoain   // clang-format on
93b739badaSJavier Setoain }
94b739badaSJavier Setoain 
configureArmSVELegalizeForExportTarget(LLVMConversionTarget & target)95b739badaSJavier Setoain void mlir::configureArmSVELegalizeForExportTarget(
96b739badaSJavier Setoain     LLVMConversionTarget &target) {
9795861216SJavier Setoain   // clang-format off
9895861216SJavier Setoain   target.addLegalOp<SdotIntrOp,
9995861216SJavier Setoain                     SmmlaIntrOp,
10095861216SJavier Setoain                     UdotIntrOp,
10195861216SJavier Setoain                     UmmlaIntrOp,
10295861216SJavier Setoain                     ScalableMaskedAddIIntrOp,
10395861216SJavier Setoain                     ScalableMaskedAddFIntrOp,
10495861216SJavier Setoain                     ScalableMaskedSubIIntrOp,
10595861216SJavier Setoain                     ScalableMaskedSubFIntrOp,
10695861216SJavier Setoain                     ScalableMaskedMulIIntrOp,
10795861216SJavier Setoain                     ScalableMaskedMulFIntrOp,
10895861216SJavier Setoain                     ScalableMaskedSDivIIntrOp,
10995861216SJavier Setoain                     ScalableMaskedUDivIIntrOp,
11095861216SJavier Setoain                     ScalableMaskedDivFIntrOp>();
11195861216SJavier Setoain   target.addIllegalOp<SdotOp,
11295861216SJavier Setoain                       SmmlaOp,
11395861216SJavier Setoain                       UdotOp,
11495861216SJavier Setoain                       UmmlaOp,
11595861216SJavier Setoain                       ScalableMaskedAddIOp,
11695861216SJavier Setoain                       ScalableMaskedAddFOp,
11795861216SJavier Setoain                       ScalableMaskedSubIOp,
11895861216SJavier Setoain                       ScalableMaskedSubFOp,
11995861216SJavier Setoain                       ScalableMaskedMulIOp,
12095861216SJavier Setoain                       ScalableMaskedMulFOp,
12195861216SJavier Setoain                       ScalableMaskedSDivIOp,
12295861216SJavier Setoain                       ScalableMaskedUDivIOp,
123a4830d14SJavier Setoain                       ScalableMaskedDivFOp>();
12495861216SJavier Setoain   // clang-format on
125b739badaSJavier Setoain }
126