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