Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/Lanai/LanaiISelLowering.h
35271 views
1
//===-- LanaiISelLowering.h - Lanai DAG Lowering Interface -....-*- C++ -*-===//
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 the interfaces that Lanai uses to lower LLVM code into a
10
// selection DAG.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_LIB_TARGET_LANAI_LANAIISELLOWERING_H
15
#define LLVM_LIB_TARGET_LANAI_LANAIISELLOWERING_H
16
17
#include "Lanai.h"
18
#include "LanaiRegisterInfo.h"
19
#include "llvm/CodeGen/SelectionDAG.h"
20
#include "llvm/CodeGen/TargetLowering.h"
21
22
namespace llvm {
23
namespace LanaiISD {
24
enum {
25
FIRST_NUMBER = ISD::BUILTIN_OP_END,
26
27
ADJDYNALLOC,
28
29
// Return with a glue operand. Operand 0 is the chain operand.
30
RET_GLUE,
31
32
// CALL - These operations represent an abstract call instruction, which
33
// includes a bunch of information.
34
CALL,
35
36
// SELECT_CC - Operand 0 and operand 1 are selection variable, operand 3
37
// is condition code and operand 4 is flag operand.
38
SELECT_CC,
39
40
// SETCC - Store the conditional code to a register.
41
SETCC,
42
43
// SET_FLAG - Set flag compare.
44
SET_FLAG,
45
46
// SUBBF - Subtract with borrow that sets flags.
47
SUBBF,
48
49
// BR_CC - Used to glue together a conditional branch and comparison
50
BR_CC,
51
52
// Wrapper - A wrapper node for TargetConstantPool, TargetExternalSymbol,
53
// and TargetGlobalAddress.
54
Wrapper,
55
56
// Get the Higher/Lower 16 bits from a 32-bit immediate.
57
HI,
58
LO,
59
60
// Small 21-bit immediate in global memory.
61
SMALL
62
};
63
} // namespace LanaiISD
64
65
class LanaiSubtarget;
66
67
class LanaiTargetLowering : public TargetLowering {
68
public:
69
LanaiTargetLowering(const TargetMachine &TM, const LanaiSubtarget &STI);
70
71
// LowerOperation - Provide custom lowering hooks for some operations.
72
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
73
74
// getTargetNodeName - This method returns the name of a target specific
75
// DAG node.
76
const char *getTargetNodeName(unsigned Opcode) const override;
77
78
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
79
SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
80
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
81
SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
82
SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
83
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
84
SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
85
SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
86
SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
87
SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
88
SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
89
SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
90
SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
91
SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
92
93
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
94
bool IsVarArg,
95
const SmallVectorImpl<ISD::OutputArg> &Outs,
96
LLVMContext &Context) const override;
97
98
Register getRegisterByName(const char *RegName, LLT VT,
99
const MachineFunction &MF) const override;
100
std::pair<unsigned, const TargetRegisterClass *>
101
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
102
StringRef Constraint, MVT VT) const override;
103
ConstraintWeight
104
getSingleConstraintMatchWeight(AsmOperandInfo &Info,
105
const char *Constraint) const override;
106
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint,
107
std::vector<SDValue> &Ops,
108
SelectionDAG &DAG) const override;
109
110
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
111
112
void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known,
113
const APInt &DemandedElts,
114
const SelectionDAG &DAG,
115
unsigned Depth = 0) const override;
116
117
private:
118
SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
119
CallingConv::ID CallConv, bool IsVarArg,
120
bool IsTailCall,
121
const SmallVectorImpl<ISD::OutputArg> &Outs,
122
const SmallVectorImpl<SDValue> &OutVals,
123
const SmallVectorImpl<ISD::InputArg> &Ins,
124
const SDLoc &dl, SelectionDAG &DAG,
125
SmallVectorImpl<SDValue> &InVals) const;
126
127
SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
128
bool IsVarArg,
129
const SmallVectorImpl<ISD::InputArg> &Ins,
130
const SDLoc &DL, SelectionDAG &DAG,
131
SmallVectorImpl<SDValue> &InVals) const;
132
133
SDValue LowerCallResult(SDValue Chain, SDValue InGlue,
134
CallingConv::ID CallConv, bool IsVarArg,
135
const SmallVectorImpl<ISD::InputArg> &Ins,
136
const SDLoc &DL, SelectionDAG &DAG,
137
SmallVectorImpl<SDValue> &InVals) const;
138
139
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
140
SmallVectorImpl<SDValue> &InVals) const override;
141
142
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
143
bool IsVarArg,
144
const SmallVectorImpl<ISD::InputArg> &Ins,
145
const SDLoc &DL, SelectionDAG &DAG,
146
SmallVectorImpl<SDValue> &InVals) const override;
147
148
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
149
const SmallVectorImpl<ISD::OutputArg> &Outs,
150
const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
151
SelectionDAG &DAG) const override;
152
153
const LanaiRegisterInfo *TRI;
154
};
155
} // namespace llvm
156
157
#endif // LLVM_LIB_TARGET_LANAI_LANAIISELLOWERING_H
158
159