// Copyright (c) 2021 CINN Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include namespace cinn { namespace backends { template class IrBuilderMixin { protected: template decltype(auto) BinOp(Args &&...args) { return mixin_builder()->CreateBinOp(std::forward(args)...); } /// \brief + template decltype(auto) Add(Args &&...args) { return mixin_builder()->CreateAdd(std::forward(args)...); } template decltype(auto) FAdd(Args &&...args) { return mixin_builder()->CreateFAdd(std::forward(args)...); } template decltype(auto) NSWAdd(Args &&...args) { return mixin_builder()->CreateNSWAdd(std::forward(args)...); } /// \brief - template decltype(auto) Sub(Args &&...args) { return mixin_builder()->CreateSub(std::forward(args)...); } template decltype(auto) FSub(Args &&...args) { return mixin_builder()->CreateFSub(std::forward(args)...); } template decltype(auto) NSWSub(Args &&...args) { return mixin_builder()->CreateNSWSub(std::forward(args)...); } /// \brief * template decltype(auto) Mul(Args &&...args) { return mixin_builder()->CreateMul(std::forward(args)...); } template decltype(auto) FMul(Args &&...args) { return mixin_builder()->CreateFMul(std::forward(args)...); } template decltype(auto) NSWMul(Args &&...args) { return mixin_builder()->CreateNSWMul(std::forward(args)...); } /// \brief / template decltype(auto) SDiv(Args &&...args) { return mixin_builder()->CreateSDiv(std::forward(args)...); } template decltype(auto) UDiv(Args &&...args) { return mixin_builder()->CreateUDiv(std::forward(args)...); } template decltype(auto) FDiv(Args &&...args) { return mixin_builder()->CreateFDiv(std::forward(args)...); } /// \brief % template decltype(auto) SRem(Args &&...args) { return mixin_builder()->CreateSRem(std::forward(args)...); } template decltype(auto) URem(Args &&...args) { return mixin_builder()->CreateURem(std::forward(args)...); } template decltype(auto) FRem(Args &&...args) { return mixin_builder()->CreateFRem(std::forward(args)...); } template decltype(auto) And(Args &&...args) { return mixin_builder()->CreateAnd(std::forward(args)...); } template decltype(auto) Or(Args &&...args) { return mixin_builder()->CreateOr(std::forward(args)...); } template decltype(auto) Not(Args &&...args) { return mixin_builder()->CreateNot(std::forward(args)...); } template decltype(auto) Neg(Args &&...args) { return mixin_builder()->CreateNeg(std::forward(args)...); } template decltype(auto) FNeg(Args &&...args) { return mixin_builder()->CreateFNeg(std::forward(args)...); } template decltype(auto) ICmpEQ(Args &&...args) { return mixin_builder()->CreateICmpEQ(std::forward(args)...); } template decltype(auto) FCmpOEQ(Args &&...args) { return mixin_builder()->CreateFCmpOEQ(std::forward(args)...); } template decltype(auto) FCmpUEQ(Args &&...args) { return mixin_builder()->CreateFCmpUEQ(std::forward(args)...); } template decltype(auto) ICmpNE(Args &&...args) { return mixin_builder()->CreateICmpNE(std::forward(args)...); } template decltype(auto) FCmpONE(Args &&...args) { return mixin_builder()->CreateFCmpONE(std::forward(args)...); } template decltype(auto) FCmpUNE(Args &&...args) { return mixin_builder()->CreateFCmpUNE(std::forward(args)...); } template decltype(auto) ICmpULE(Args &&...args) { return mixin_builder()->CreateICmpULE(std::forward(args)...); } template decltype(auto) FCmpOLE(Args &&...args) { return mixin_builder()->CreateFCmpOLE(std::forward(args)...); } template decltype(auto) ICmpULT(Args &&...args) { return mixin_builder()->CreateICmpULT(std::forward(args)...); } template decltype(auto) ICmpSLT(Args &&...args) { return mixin_builder()->CreateICmpSLT(std::forward(args)...); } template decltype(auto) FCmpOLT(Args &&...args) { return mixin_builder()->CreateFCmpOLT(std::forward(args)...); } template decltype(auto) ICmpUGE(Args &&...args) { return mixin_builder()->CreateICmpUGE(std::forward(args)...); } template decltype(auto) ICmpSGE(Args &&...args) { return mixin_builder()->CreateICmpSGE(std::forward(args)...); } template decltype(auto) FCmpOGE(Args &&...args) { return mixin_builder()->CreateFCmpOGE(std::forward(args)...); } template decltype(auto) ICmpUGT(Args &&...args) { return mixin_builder()->CreateICmpUGT(std::forward(args)...); } template decltype(auto) ICmpSGT(Args &&...args) { return mixin_builder()->CreateICmpSGT(std::forward(args)...); } template decltype(auto) FCmpOGT(Args &&...args) { return mixin_builder()->CreateFCmpOGT(std::forward(args)...); } template decltype(auto) BitCast(Args &&...args) { return mixin_builder()->CreateBitCast(std::forward(args)...); } template decltype(auto) IntCast(Args &&...args) { return mixin_builder()->CreateIntCast(std::forward(args)...); } template decltype(auto) FPCast(Args &&...args) { return mixin_builder()->CreateFPCast(std::forward(args)...); } template decltype(auto) PointerCast(Args &&...args) { return mixin_builder()->CreatePointerCast(std::forward(args)...); } template decltype(auto) FPToSI(Args &&...args) { return mixin_builder()->CreateFPToSI(std::forward(args)...); } template decltype(auto) FPToUI(Args &&...args) { return mixin_builder()->CreateFPToUI(std::forward(args)...); } template decltype(auto) SIToFP(Args &&...args) { return mixin_builder()->CreateSIToFP(std::forward(args)...); } template decltype(auto) UIToFP(Args &&...args) { return mixin_builder()->CreateUIToFP(std::forward(args)...); } template decltype(auto) Select(Args &&...args) { return mixin_builder()->CreateSelect(std::forward(args)...); } template decltype(auto) Br(Args &&...args) { return mixin_builder()->CreateBr(std::forward(args)...); } template decltype(auto) CondBr(Args &&...args) { return mixin_builder()->CreateCondBr(std::forward(args)...); } template decltype(auto) Alloca(Args &&...args) { return mixin_builder()->CreateAlloca(std::forward(args)...); } template decltype(auto) Load(Args &&...args) { return mixin_builder()->CreateLoad(std::forward(args)...); } template decltype(auto) AlignedLoad(Args &&...args) { return mixin_builder()->CreateAlignedLoad(std::forward(args)...); } template decltype(auto) Store(Args &&...args) { return mixin_builder()->CreateStore(std::forward(args)...); } template decltype(auto) AlignedStore(Args &&...args) { return mixin_builder()->CreateAlignedStore(std::forward(args)...); } template decltype(auto) Call(Args &&...args) { return mixin_builder()->CreateCall(std::forward(args)...); } template decltype(auto) RetVoid(Args &&...args) { return mixin_builder()->CreateRetVoid(std::forward(args)...); } template decltype(auto) GEP(Args &&...args) { return mixin_builder()->CreateGEP(std::forward(args)...); } template decltype(auto) InBoundsGEP(Args &&...args) { return mixin_builder()->CreateInBoundsGEP(std::forward(args)...); } template decltype(auto) PHI(Args &&...args) { return mixin_builder()->CreatePHI(std::forward(args)...); } template decltype(auto) InsertValue(Args &&...args) { return mixin_builder()->CreateInsertValue(std::forward(args)...); } template decltype(auto) ExtractValue(Args &&...args) { return mixin_builder()->CreateExtractValue(std::forward(args)...); } template decltype(auto) InsertElement(Args &&...args) { return mixin_builder()->CreateInsertElement(std::forward(args)...); } template decltype(auto) ShuffleVector(Args &&...args) { return mixin_builder()->CreateShuffleVector(std::forward(args)...); } private: llvm::IRBuilder<> *mixin_builder() { return static_cast(this)->b(); } }; } // namespace backends } // namespace cinn