15ffd83dbSDimitry Andric //===---- RISCVISelDAGToDAG.h - A dag to dag inst selector for RISCV ------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric // 95ffd83dbSDimitry Andric // This file defines an instruction selector for the RISCV target. 105ffd83dbSDimitry Andric // 115ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 125ffd83dbSDimitry Andric 135ffd83dbSDimitry Andric #ifndef LLVM_LIB_TARGET_RISCV_RISCVISELDAGTODAG_H 145ffd83dbSDimitry Andric #define LLVM_LIB_TARGET_RISCV_RISCVISELDAGTODAG_H 155ffd83dbSDimitry Andric 165ffd83dbSDimitry Andric #include "RISCV.h" 175ffd83dbSDimitry Andric #include "RISCVTargetMachine.h" 185ffd83dbSDimitry Andric #include "llvm/CodeGen/SelectionDAGISel.h" 195ffd83dbSDimitry Andric 205ffd83dbSDimitry Andric // RISCV-specific code to select RISCV machine instructions for 215ffd83dbSDimitry Andric // SelectionDAG operations. 225ffd83dbSDimitry Andric namespace llvm { 235ffd83dbSDimitry Andric class RISCVDAGToDAGISel : public SelectionDAGISel { 245ffd83dbSDimitry Andric const RISCVSubtarget *Subtarget = nullptr; 255ffd83dbSDimitry Andric 265ffd83dbSDimitry Andric public: 275ffd83dbSDimitry Andric explicit RISCVDAGToDAGISel(RISCVTargetMachine &TargetMachine) 285ffd83dbSDimitry Andric : SelectionDAGISel(TargetMachine) {} 295ffd83dbSDimitry Andric 305ffd83dbSDimitry Andric StringRef getPassName() const override { 315ffd83dbSDimitry Andric return "RISCV DAG->DAG Pattern Instruction Selection"; 325ffd83dbSDimitry Andric } 335ffd83dbSDimitry Andric 345ffd83dbSDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override { 355ffd83dbSDimitry Andric Subtarget = &MF.getSubtarget<RISCVSubtarget>(); 365ffd83dbSDimitry Andric return SelectionDAGISel::runOnMachineFunction(MF); 375ffd83dbSDimitry Andric } 385ffd83dbSDimitry Andric 39*fe6060f1SDimitry Andric void PreprocessISelDAG() override; 405ffd83dbSDimitry Andric void PostprocessISelDAG() override; 415ffd83dbSDimitry Andric 425ffd83dbSDimitry Andric void Select(SDNode *Node) override; 435ffd83dbSDimitry Andric 445ffd83dbSDimitry Andric bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID, 455ffd83dbSDimitry Andric std::vector<SDValue> &OutOps) override; 465ffd83dbSDimitry Andric 475ffd83dbSDimitry Andric bool SelectAddrFI(SDValue Addr, SDValue &Base); 48*fe6060f1SDimitry Andric bool SelectBaseAddr(SDValue Addr, SDValue &Base); 495ffd83dbSDimitry Andric 50*fe6060f1SDimitry Andric bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt); 51*fe6060f1SDimitry Andric bool selectShiftMaskXLen(SDValue N, SDValue &ShAmt) { 52*fe6060f1SDimitry Andric return selectShiftMask(N, Subtarget->getXLen(), ShAmt); 53*fe6060f1SDimitry Andric } 54*fe6060f1SDimitry Andric bool selectShiftMask32(SDValue N, SDValue &ShAmt) { 55*fe6060f1SDimitry Andric return selectShiftMask(N, 32, ShAmt); 56*fe6060f1SDimitry Andric } 57*fe6060f1SDimitry Andric 58*fe6060f1SDimitry Andric bool selectSExti32(SDValue N, SDValue &Val); 59*fe6060f1SDimitry Andric bool selectZExti32(SDValue N, SDValue &Val); 60e8d8bef9SDimitry Andric 61d409305fSDimitry Andric bool selectVLOp(SDValue N, SDValue &VL); 62d409305fSDimitry Andric 63e8d8bef9SDimitry Andric bool selectVSplat(SDValue N, SDValue &SplatVal); 64e8d8bef9SDimitry Andric bool selectVSplatSimm5(SDValue N, SDValue &SplatVal); 65e8d8bef9SDimitry Andric bool selectVSplatUimm5(SDValue N, SDValue &SplatVal); 66*fe6060f1SDimitry Andric bool selectVSplatSimm5Plus1(SDValue N, SDValue &SplatVal); 67*fe6060f1SDimitry Andric bool selectVSplatSimm5Plus1NonZero(SDValue N, SDValue &SplatVal); 68e8d8bef9SDimitry Andric 69*fe6060f1SDimitry Andric bool selectRVVSimm5(SDValue N, unsigned Width, SDValue &Imm); 70*fe6060f1SDimitry Andric template <unsigned Width> bool selectRVVSimm5(SDValue N, SDValue &Imm) { 71*fe6060f1SDimitry Andric return selectRVVSimm5(N, Width, Imm); 72*fe6060f1SDimitry Andric } 73*fe6060f1SDimitry Andric 74*fe6060f1SDimitry Andric void addVectorLoadStoreOperands(SDNode *Node, unsigned SEWImm, 75*fe6060f1SDimitry Andric const SDLoc &DL, unsigned CurOp, 76*fe6060f1SDimitry Andric bool IsMasked, bool IsStridedOrIndexed, 77*fe6060f1SDimitry Andric SmallVectorImpl<SDValue> &Operands, 78*fe6060f1SDimitry Andric MVT *IndexVT = nullptr); 79*fe6060f1SDimitry Andric 80*fe6060f1SDimitry Andric void selectVLSEG(SDNode *Node, bool IsMasked, bool IsStrided); 81*fe6060f1SDimitry Andric void selectVLSEGFF(SDNode *Node, bool IsMasked); 82*fe6060f1SDimitry Andric void selectVLXSEG(SDNode *Node, bool IsMasked, bool IsOrdered); 83*fe6060f1SDimitry Andric void selectVSSEG(SDNode *Node, bool IsMasked, bool IsStrided); 84*fe6060f1SDimitry Andric void selectVSXSEG(SDNode *Node, bool IsMasked, bool IsOrdered); 85979e22ffSDimitry Andric 865ffd83dbSDimitry Andric // Include the pieces autogenerated from the target description. 875ffd83dbSDimitry Andric #include "RISCVGenDAGISel.inc" 885ffd83dbSDimitry Andric 895ffd83dbSDimitry Andric private: 905ffd83dbSDimitry Andric void doPeepholeLoadStoreADDI(); 915ffd83dbSDimitry Andric }; 92*fe6060f1SDimitry Andric 93*fe6060f1SDimitry Andric namespace RISCV { 94*fe6060f1SDimitry Andric struct VLSEGPseudo { 95*fe6060f1SDimitry Andric uint16_t NF : 4; 96*fe6060f1SDimitry Andric uint16_t Masked : 1; 97*fe6060f1SDimitry Andric uint16_t Strided : 1; 98*fe6060f1SDimitry Andric uint16_t FF : 1; 99*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 100*fe6060f1SDimitry Andric uint16_t LMUL : 3; 101*fe6060f1SDimitry Andric uint16_t Pseudo; 102*fe6060f1SDimitry Andric }; 103*fe6060f1SDimitry Andric 104*fe6060f1SDimitry Andric struct VLXSEGPseudo { 105*fe6060f1SDimitry Andric uint16_t NF : 4; 106*fe6060f1SDimitry Andric uint16_t Masked : 1; 107*fe6060f1SDimitry Andric uint16_t Ordered : 1; 108*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 109*fe6060f1SDimitry Andric uint16_t LMUL : 3; 110*fe6060f1SDimitry Andric uint16_t IndexLMUL : 3; 111*fe6060f1SDimitry Andric uint16_t Pseudo; 112*fe6060f1SDimitry Andric }; 113*fe6060f1SDimitry Andric 114*fe6060f1SDimitry Andric struct VSSEGPseudo { 115*fe6060f1SDimitry Andric uint16_t NF : 4; 116*fe6060f1SDimitry Andric uint16_t Masked : 1; 117*fe6060f1SDimitry Andric uint16_t Strided : 1; 118*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 119*fe6060f1SDimitry Andric uint16_t LMUL : 3; 120*fe6060f1SDimitry Andric uint16_t Pseudo; 121*fe6060f1SDimitry Andric }; 122*fe6060f1SDimitry Andric 123*fe6060f1SDimitry Andric struct VSXSEGPseudo { 124*fe6060f1SDimitry Andric uint16_t NF : 4; 125*fe6060f1SDimitry Andric uint16_t Masked : 1; 126*fe6060f1SDimitry Andric uint16_t Ordered : 1; 127*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 128*fe6060f1SDimitry Andric uint16_t LMUL : 3; 129*fe6060f1SDimitry Andric uint16_t IndexLMUL : 3; 130*fe6060f1SDimitry Andric uint16_t Pseudo; 131*fe6060f1SDimitry Andric }; 132*fe6060f1SDimitry Andric 133*fe6060f1SDimitry Andric struct VLEPseudo { 134*fe6060f1SDimitry Andric uint16_t Masked : 1; 135*fe6060f1SDimitry Andric uint16_t Strided : 1; 136*fe6060f1SDimitry Andric uint16_t FF : 1; 137*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 138*fe6060f1SDimitry Andric uint16_t LMUL : 3; 139*fe6060f1SDimitry Andric uint16_t Pseudo; 140*fe6060f1SDimitry Andric }; 141*fe6060f1SDimitry Andric 142*fe6060f1SDimitry Andric struct VSEPseudo { 143*fe6060f1SDimitry Andric uint16_t Masked :1; 144*fe6060f1SDimitry Andric uint16_t Strided : 1; 145*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 146*fe6060f1SDimitry Andric uint16_t LMUL : 3; 147*fe6060f1SDimitry Andric uint16_t Pseudo; 148*fe6060f1SDimitry Andric }; 149*fe6060f1SDimitry Andric 150*fe6060f1SDimitry Andric struct VLX_VSXPseudo { 151*fe6060f1SDimitry Andric uint16_t Masked : 1; 152*fe6060f1SDimitry Andric uint16_t Ordered : 1; 153*fe6060f1SDimitry Andric uint16_t Log2SEW : 3; 154*fe6060f1SDimitry Andric uint16_t LMUL : 3; 155*fe6060f1SDimitry Andric uint16_t IndexLMUL : 3; 156*fe6060f1SDimitry Andric uint16_t Pseudo; 157*fe6060f1SDimitry Andric }; 158*fe6060f1SDimitry Andric 159*fe6060f1SDimitry Andric #define GET_RISCVVSSEGTable_DECL 160*fe6060f1SDimitry Andric #define GET_RISCVVLSEGTable_DECL 161*fe6060f1SDimitry Andric #define GET_RISCVVLXSEGTable_DECL 162*fe6060f1SDimitry Andric #define GET_RISCVVSXSEGTable_DECL 163*fe6060f1SDimitry Andric #define GET_RISCVVLETable_DECL 164*fe6060f1SDimitry Andric #define GET_RISCVVSETable_DECL 165*fe6060f1SDimitry Andric #define GET_RISCVVLXTable_DECL 166*fe6060f1SDimitry Andric #define GET_RISCVVSXTable_DECL 167*fe6060f1SDimitry Andric #include "RISCVGenSearchableTables.inc" 168*fe6060f1SDimitry Andric } // namespace RISCV 169*fe6060f1SDimitry Andric 170*fe6060f1SDimitry Andric } // namespace llvm 1715ffd83dbSDimitry Andric 1725ffd83dbSDimitry Andric #endif 173