xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVSelectionDAGInfo.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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