1*700637cbSDimitry Andric //===----------------------------------------------------------------------===// 2*700637cbSDimitry Andric // 3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*700637cbSDimitry Andric // 7*700637cbSDimitry Andric //===----------------------------------------------------------------------===// 8*700637cbSDimitry Andric 9*700637cbSDimitry Andric #ifndef LLVM_LIB_TARGET_RISCV_RISCVSELECTIONDAGINFO_H 10*700637cbSDimitry Andric #define LLVM_LIB_TARGET_RISCV_RISCVSELECTIONDAGINFO_H 11*700637cbSDimitry Andric 12*700637cbSDimitry Andric #include "llvm/CodeGen/SDNodeInfo.h" 13*700637cbSDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 14*700637cbSDimitry Andric 15*700637cbSDimitry Andric #define GET_SDNODE_ENUM 16*700637cbSDimitry Andric #include "RISCVGenSDNodeInfo.inc" 17*700637cbSDimitry Andric 18*700637cbSDimitry Andric namespace llvm { 19*700637cbSDimitry Andric 20*700637cbSDimitry Andric namespace RISCVISD { 21*700637cbSDimitry Andric // RISCVISD Node TSFlags 22*700637cbSDimitry Andric enum : llvm::SDNodeTSFlags { 23*700637cbSDimitry Andric HasPassthruOpMask = 1 << 0, 24*700637cbSDimitry Andric HasMaskOpMask = 1 << 1, 25*700637cbSDimitry Andric }; 26*700637cbSDimitry Andric } // namespace RISCVISD 27*700637cbSDimitry Andric 28*700637cbSDimitry Andric class RISCVSelectionDAGInfo : public SelectionDAGGenTargetInfo { 29*700637cbSDimitry Andric public: 30*700637cbSDimitry Andric RISCVSelectionDAGInfo(); 31*700637cbSDimitry Andric 32*700637cbSDimitry Andric ~RISCVSelectionDAGInfo() override; 33*700637cbSDimitry Andric 34*700637cbSDimitry Andric void verifyTargetNode(const SelectionDAG &DAG, 35*700637cbSDimitry Andric const SDNode *N) const override; 36*700637cbSDimitry Andric hasPassthruOp(unsigned Opcode)37*700637cbSDimitry Andric bool hasPassthruOp(unsigned Opcode) const { 38*700637cbSDimitry Andric return GenNodeInfo.getDesc(Opcode).TSFlags & RISCVISD::HasPassthruOpMask; 39*700637cbSDimitry Andric } 40*700637cbSDimitry Andric hasMaskOp(unsigned Opcode)41*700637cbSDimitry Andric bool hasMaskOp(unsigned Opcode) const { 42*700637cbSDimitry Andric return GenNodeInfo.getDesc(Opcode).TSFlags & RISCVISD::HasMaskOpMask; 43*700637cbSDimitry Andric } 44*700637cbSDimitry Andric getMAccOpcode(unsigned MulOpcode)45*700637cbSDimitry Andric unsigned getMAccOpcode(unsigned MulOpcode) const { 46*700637cbSDimitry Andric switch (static_cast<RISCVISD::GenNodeType>(MulOpcode)) { 47*700637cbSDimitry Andric default: 48*700637cbSDimitry Andric llvm_unreachable("Unexpected opcode"); 49*700637cbSDimitry Andric case RISCVISD::VWMUL_VL: 50*700637cbSDimitry Andric return RISCVISD::VWMACC_VL; 51*700637cbSDimitry Andric case RISCVISD::VWMULU_VL: 52*700637cbSDimitry Andric return RISCVISD::VWMACCU_VL; 53*700637cbSDimitry Andric case RISCVISD::VWMULSU_VL: 54*700637cbSDimitry Andric return RISCVISD::VWMACCSU_VL; 55*700637cbSDimitry Andric } 56*700637cbSDimitry Andric } 57*700637cbSDimitry Andric }; 58*700637cbSDimitry Andric 59*700637cbSDimitry Andric } // namespace llvm 60*700637cbSDimitry Andric 61*700637cbSDimitry Andric #endif // LLVM_LIB_TARGET_RISCV_RISCVSELECTIONDAGINFO_H 62