xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
181ad6265SDimitry Andric //=- LoongArchISelDAGToDAG.h - A dag to dag inst selector for LoongArch ---===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file defines an instruction selector for the LoongArch target.
1081ad6265SDimitry Andric //
1181ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric 
1381ad6265SDimitry Andric #ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
1481ad6265SDimitry Andric #define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
1581ad6265SDimitry Andric 
1681ad6265SDimitry Andric #include "LoongArch.h"
1781ad6265SDimitry Andric #include "LoongArchTargetMachine.h"
1881ad6265SDimitry Andric #include "llvm/CodeGen/SelectionDAGISel.h"
1981ad6265SDimitry Andric 
2081ad6265SDimitry Andric // LoongArch-specific code to select LoongArch machine instructions for
2181ad6265SDimitry Andric // SelectionDAG operations.
2281ad6265SDimitry Andric namespace llvm {
2381ad6265SDimitry Andric class LoongArchDAGToDAGISel : public SelectionDAGISel {
2481ad6265SDimitry Andric   const LoongArchSubtarget *Subtarget = nullptr;
2581ad6265SDimitry Andric 
2681ad6265SDimitry Andric public:
27bdd1243dSDimitry Andric   LoongArchDAGToDAGISel() = delete;
28bdd1243dSDimitry Andric 
29bdd1243dSDimitry Andric   explicit LoongArchDAGToDAGISel(LoongArchTargetMachine &TM)
30*0fca6ea1SDimitry Andric       : SelectionDAGISel(TM) {}
3181ad6265SDimitry Andric 
3281ad6265SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override {
3381ad6265SDimitry Andric     Subtarget = &MF.getSubtarget<LoongArchSubtarget>();
3481ad6265SDimitry Andric     return SelectionDAGISel::runOnMachineFunction(MF);
3581ad6265SDimitry Andric   }
3681ad6265SDimitry Andric 
3781ad6265SDimitry Andric   void Select(SDNode *Node) override;
3881ad6265SDimitry Andric 
395f757f3fSDimitry Andric   bool SelectInlineAsmMemoryOperand(const SDValue &Op,
405f757f3fSDimitry Andric                                     InlineAsm::ConstraintCode ConstraintID,
41bdd1243dSDimitry Andric                                     std::vector<SDValue> &OutOps) override;
42bdd1243dSDimitry Andric 
43753f127fSDimitry Andric   bool SelectBaseAddr(SDValue Addr, SDValue &Base);
4406c3fb27SDimitry Andric   bool SelectAddrConstant(SDValue Addr, SDValue &Base, SDValue &Offset);
45bdd1243dSDimitry Andric   bool selectNonFIBaseAddr(SDValue Addr, SDValue &Base);
46753f127fSDimitry Andric 
4781ad6265SDimitry Andric   bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt);
4881ad6265SDimitry Andric   bool selectShiftMaskGRLen(SDValue N, SDValue &ShAmt) {
4981ad6265SDimitry Andric     return selectShiftMask(N, Subtarget->getGRLen(), ShAmt);
5081ad6265SDimitry Andric   }
5181ad6265SDimitry Andric   bool selectShiftMask32(SDValue N, SDValue &ShAmt) {
5281ad6265SDimitry Andric     return selectShiftMask(N, 32, ShAmt);
5381ad6265SDimitry Andric   }
5481ad6265SDimitry Andric 
55753f127fSDimitry Andric   bool selectSExti32(SDValue N, SDValue &Val);
56753f127fSDimitry Andric   bool selectZExti32(SDValue N, SDValue &Val);
57753f127fSDimitry Andric 
585f757f3fSDimitry Andric   bool selectVSplat(SDNode *N, APInt &Imm, unsigned MinSizeInBits) const;
595f757f3fSDimitry Andric 
605f757f3fSDimitry Andric   template <unsigned ImmSize, bool IsSigned = false>
615f757f3fSDimitry Andric   bool selectVSplatImm(SDValue N, SDValue &SplatVal);
625f757f3fSDimitry Andric 
635f757f3fSDimitry Andric   bool selectVSplatUimmInvPow2(SDValue N, SDValue &SplatImm) const;
645f757f3fSDimitry Andric   bool selectVSplatUimmPow2(SDValue N, SDValue &SplatImm) const;
655f757f3fSDimitry Andric 
6681ad6265SDimitry Andric // Include the pieces autogenerated from the target description.
6781ad6265SDimitry Andric #include "LoongArchGenDAGISel.inc"
6881ad6265SDimitry Andric };
6981ad6265SDimitry Andric 
70*0fca6ea1SDimitry Andric class LoongArchDAGToDAGISelLegacy : public SelectionDAGISelLegacy {
71*0fca6ea1SDimitry Andric public:
72*0fca6ea1SDimitry Andric   static char ID;
73*0fca6ea1SDimitry Andric   explicit LoongArchDAGToDAGISelLegacy(LoongArchTargetMachine &TM);
74*0fca6ea1SDimitry Andric };
75*0fca6ea1SDimitry Andric 
76972a253aSDimitry Andric } // end namespace llvm
7781ad6265SDimitry Andric 
7881ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
79