LLVM 22.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"
19
20// LoongArch-specific code to select LoongArch machine instructions for
21// SelectionDAG operations.
22namespace llvm {
24 const LoongArchSubtarget *Subtarget = nullptr;
25
26public:
28
32
34 Subtarget = &MF.getSubtarget<LoongArchSubtarget>();
36 }
37
38 void Select(SDNode *Node) override;
39
41 InlineAsm::ConstraintCode ConstraintID,
42 std::vector<SDValue> &OutOps) override;
43
48
49 bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt);
51 return selectShiftMask(N, Subtarget->getGRLen(), ShAmt);
52 }
54 return selectShiftMask(N, 32, ShAmt);
55 }
56
57 bool selectSExti32(SDValue N, SDValue &Val);
58 bool selectZExti32(SDValue N, SDValue &Val);
59
60 bool selectVSplat(SDNode *N, APInt &Imm, unsigned MinSizeInBits) const;
61
62 template <unsigned ImmSize, bool IsSigned = false>
63 bool selectVSplatImm(SDValue N, SDValue &SplatVal);
64
65 bool selectVSplatUimmInvPow2(SDValue N, SDValue &SplatImm) const;
66 bool selectVSplatUimmPow2(SDValue N, SDValue &SplatImm) const;
67
68 // Return the LoongArch branch opcode that matches the given DAG integer
69 // condition code. The CondCode must be one of those supported by the
70 // LoongArch ISA (see translateSetCCForBranch).
71 static unsigned getBranchOpcForIntCC(ISD::CondCode CC) {
72 switch (CC) {
73 default:
74 llvm_unreachable("Unsupported CondCode");
75 case ISD::SETEQ:
76 return LoongArch::BEQ;
77 case ISD::SETNE:
78 return LoongArch::BNE;
79 case ISD::SETLT:
80 return LoongArch::BLT;
81 case ISD::SETGE:
82 return LoongArch::BGE;
83 case ISD::SETULT:
84 return LoongArch::BLTU;
85 case ISD::SETUGE:
86 return LoongArch::BGEU;
87 }
88 }
89
90// Include the pieces autogenerated from the target description.
91#include "LoongArchGenDAGISel.inc"
92};
93
95public:
96 static char ID;
98 CodeGenOptLevel OptLevel);
99};
100
101} // end namespace llvm
102
103#endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
uint64_t Addr
Class for arbitrary precision integers.
Definition: APInt.h:78
This class represents an Operation in the Expression.
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 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 SelectAddrConstant(SDValue Addr, SDValue &Base, SDValue &Offset)
bool selectVSplat(SDNode *N, APInt &Imm, unsigned MinSizeInBits) const
bool selectVSplatImm(SDValue N, SDValue &SplatVal)
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)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
MachineFunction * MF
CodeGenOptLevel OptLevel
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,...
Definition: ISDOpcodes.h:1691
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:82
#define N