LLVM 23.0.0git
LoongArchISelDAGToDAG.h
Go to the documentation of this file.
1//=- LoongArchISelDAGToDAG.h - A dag to dag inst selector for LoongArch ---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines an instruction selector for the LoongArch target.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
14#define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
15
16#include "LoongArch.h"
20
21// LoongArch-specific code to select LoongArch machine instructions for
22// SelectionDAG operations.
23namespace llvm {
25 const LoongArchSubtarget *Subtarget = nullptr;
26
27public:
29
33
35 Subtarget = &MF.getSubtarget<LoongArchSubtarget>();
37 }
38
39 void Select(SDNode *Node) override;
40
42 InlineAsm::ConstraintCode ConstraintID,
43 std::vector<SDValue> &OutOps) override;
44
49
50 bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt);
52 return selectShiftMask(N, Subtarget->getGRLen(), ShAmt);
53 }
55 return selectShiftMask(N, 32, ShAmt);
56 }
57
58 bool selectSExti32(SDValue N, SDValue &Val);
59 bool selectZExti32(SDValue N, SDValue &Val);
60
61 bool selectVSplat(SDNode *N, APInt &Imm, unsigned MinSizeInBits) const;
62
63 template <unsigned ImmSize, unsigned EltSize = 0, bool IsSigned = false>
64 bool selectVSplatImm(SDValue N, SDValue &SplatVal);
65 template <unsigned ImmSize>
66 bool selectVSplatImmNeg(SDValue N, SDValue &SplatVal) const;
67
68 bool selectVSplatUimmInvPow2(SDValue N, SDValue &SplatImm) const;
69 bool selectVSplatUimmPow2(SDValue N, SDValue &SplatImm) const;
70
71 // Return the LoongArch branch opcode that matches the given DAG integer
72 // condition code. The CondCode must be one of those supported by the
73 // LoongArch ISA (see translateSetCCForBranch).
74 static unsigned getBranchOpcForIntCC(ISD::CondCode CC) {
75 switch (CC) {
76 default:
77 llvm_unreachable("Unsupported CondCode");
78 case ISD::SETEQ:
79 return LoongArch::BEQ;
80 case ISD::SETNE:
81 return LoongArch::BNE;
82 case ISD::SETLT:
83 return LoongArch::BLT;
84 case ISD::SETGE:
85 return LoongArch::BGE;
86 case ISD::SETULT:
87 return LoongArch::BLTU;
88 case ISD::SETUGE:
89 return LoongArch::BGEU;
90 }
91 }
92
93// Include the pieces autogenerated from the target description.
94#include "LoongArchGenDAGISel.inc"
95};
96
98public:
99 static char ID;
101 CodeGenOptLevel OptLevel);
102};
103
104} // end namespace llvm
105
106#endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
Class for arbitrary precision integers.
Definition APInt.h:78
LoongArchDAGToDAGISelLegacy(LoongArchTargetMachine &TM, CodeGenOptLevel OptLevel)
bool selectNonFIBaseAddr(SDValue Addr, SDValue &Base)
bool selectShiftMask32(SDValue N, SDValue &ShAmt)
bool selectSExti32(SDValue N, SDValue &Val)
bool SelectInlineAsmMemoryOperand(const SDValue &Op, InlineAsm::ConstraintCode ConstraintID, std::vector< SDValue > &OutOps) override
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
bool selectVSplatUimmPow2(SDValue N, SDValue &SplatImm) const
bool selectShiftMaskGRLen(SDValue N, SDValue &ShAmt)
static unsigned getBranchOpcForIntCC(ISD::CondCode CC)
bool selectVSplatImm(SDValue N, SDValue &SplatVal)
bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt)
bool selectZExti32(SDValue N, SDValue &Val)
bool SelectAddrRegImm12(SDValue Addr, SDValue &Base, SDValue &Offset)
LoongArchDAGToDAGISel(LoongArchTargetMachine &TM, CodeGenOptLevel OptLevel)
bool selectVSplatImmNeg(SDValue N, SDValue &SplatVal) const
bool SelectAddrConstant(SDValue Addr, SDValue &Base, SDValue &Offset)
bool selectVSplat(SDNode *N, APInt &Imm, unsigned MinSizeInBits) const
void Select(SDNode *Node) override
Main hook for targets to transform nodes into machine nodes.
bool selectVSplatUimmInvPow2(SDValue N, SDValue &SplatImm) const
bool runOnMachineFunction(MachineFunction &MF) override
bool SelectBaseAddr(SDValue Addr, SDValue &Base)
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SelectionDAGISelLegacy(char &ID, std::unique_ptr< SelectionDAGISel > S)
SelectionDAGISel(TargetMachine &tm, CodeGenOptLevel OL=CodeGenOptLevel::Default)
virtual bool runOnMachineFunction(MachineFunction &mf)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
DWARFExpression::Operation Op
#define N