LLVM  8.0.1
XCoreISelLowering.h
Go to the documentation of this file.
1 //===-- XCoreISelLowering.h - XCore DAG Lowering Interface ------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the interfaces that XCore uses to lower LLVM code into a
11 // selection DAG.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_TARGET_XCORE_XCOREISELLOWERING_H
16 #define LLVM_LIB_TARGET_XCORE_XCOREISELLOWERING_H
17 
18 #include "XCore.h"
21 
22 namespace llvm {
23 
24  // Forward delcarations
25  class XCoreSubtarget;
26  class XCoreTargetMachine;
27 
28  namespace XCoreISD {
29  enum NodeType : unsigned {
30  // Start the numbering where the builtin ops and target ops leave off.
32 
33  // Branch and link (call)
34  BL,
35 
36  // pc relative address
38 
39  // dp relative address
41 
42  // cp relative address
44 
45  // Load word from stack
47 
48  // Store word to stack
50 
51  // Corresponds to retsp instruction
53 
54  // Corresponds to LADD instruction
56 
57  // Corresponds to LSUB instruction
59 
60  // Corresponds to LMUL instruction
62 
63  // Corresponds to MACCU instruction
65 
66  // Corresponds to MACCS instruction
68 
69  // Corresponds to CRC8 instruction
71 
72  // Jumptable branch.
74 
75  // Jumptable branch using long branches for each entry.
77 
78  // Offset from frame pointer to the first (possible) on-stack argument
80 
81  // Exception handler return. The stack is restored to the first
82  // followed by a jump to the second argument.
84 
85  // Memory barrier.
87  };
88  }
89 
90  //===--------------------------------------------------------------------===//
91  // TargetLowering Implementation
92  //===--------------------------------------------------------------------===//
94  {
95  public:
96  explicit XCoreTargetLowering(const TargetMachine &TM,
97  const XCoreSubtarget &Subtarget);
98 
100  bool isZExtFree(SDValue Val, EVT VT2) const override;
101 
102 
103  unsigned getJumpTableEncoding() const override;
104  MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override {
105  return MVT::i32;
106  }
107 
108  /// LowerOperation - Provide custom lowering hooks for some operations.
109  SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
110 
111  /// ReplaceNodeResults - Replace the results of node with an illegal result
112  /// type with new values built out of custom code.
113  ///
114  void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
115  SelectionDAG &DAG) const override;
116 
117  /// getTargetNodeName - This method returns the name of a target specific
118  // DAG node.
119  const char *getTargetNodeName(unsigned Opcode) const override;
120 
122  EmitInstrWithCustomInserter(MachineInstr &MI,
123  MachineBasicBlock *MBB) const override;
124 
125  bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
126  Type *Ty, unsigned AS,
127  Instruction *I = nullptr) const override;
128 
129  /// If a physical register, this returns the register that receives the
130  /// exception address on entry to an EH pad.
131  unsigned
132  getExceptionPointerRegister(const Constant *PersonalityFn) const override {
133  return XCore::R0;
134  }
135 
136  /// If a physical register, this returns the register that receives the
137  /// exception typeid on entry to a landing pad.
138  unsigned
139  getExceptionSelectorRegister(const Constant *PersonalityFn) const override {
140  return XCore::R1;
141  }
142 
143  private:
144  const TargetMachine &TM;
145  const XCoreSubtarget &Subtarget;
146 
147  // Lower Operand helpers
148  SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv,
149  bool isVarArg,
151  const SDLoc &dl, SelectionDAG &DAG,
152  SmallVectorImpl<SDValue> &InVals) const;
153  SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
154  CallingConv::ID CallConv, bool isVarArg,
155  bool isTailCall,
157  const SmallVectorImpl<SDValue> &OutVals,
159  const SDLoc &dl, SelectionDAG &DAG,
160  SmallVectorImpl<SDValue> &InVals) const;
161  SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
162  SDValue getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV,
163  SelectionDAG &DAG) const;
164  SDValue lowerLoadWordFromAlignedBasePlusOffset(const SDLoc &DL,
165  SDValue Chain, SDValue Base,
166  int64_t Offset,
167  SelectionDAG &DAG) const;
168 
169  // Lower Operand specifics
170  SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
171  SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
172  SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
173  SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
174  SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
175  SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
176  SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
177  SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
178  SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
179  SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
180  SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
181  SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
182  SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
183  SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
185  SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
187  SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
189  SDValue LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
191 
192  // Inline asm support
193  std::pair<unsigned, const TargetRegisterClass *>
194  getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
195  StringRef Constraint, MVT VT) const override;
196 
197  // Expand specifics
198  SDValue TryExpandADDWithMul(SDNode *Op, SelectionDAG &DAG) const;
199  SDValue ExpandADDSUB(SDNode *Op, SelectionDAG &DAG) const;
200 
201  SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
202 
203  void computeKnownBitsForTargetNode(const SDValue Op,
204  KnownBits &Known,
205  const APInt &DemandedElts,
206  const SelectionDAG &DAG,
207  unsigned Depth = 0) const override;
208 
209  SDValue
210  LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
212  const SDLoc &dl, SelectionDAG &DAG,
213  SmallVectorImpl<SDValue> &InVals) const override;
214 
215  SDValue
216  LowerCall(TargetLowering::CallLoweringInfo &CLI,
217  SmallVectorImpl<SDValue> &InVals) const override;
218 
219  SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
221  const SmallVectorImpl<SDValue> &OutVals,
222  const SDLoc &dl, SelectionDAG &DAG) const override;
223 
224  bool
225  CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
226  bool isVarArg,
227  const SmallVectorImpl<ISD::OutputArg> &ArgsFlags,
228  LLVMContext &Context) const override;
229  bool shouldInsertFencesForAtomic(const Instruction *I) const override {
230  return true;
231  }
232  };
233 }
234 
235 #endif
static SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG)
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:877
A parsed version of the target data layout string in and methods for querying it. ...
Definition: DataLayout.h:111
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg If BaseGV is null...
LLVMContext & Context
This class represents lattice values for constants.
Definition: AllocatorList.h:24
static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
Function Alias Analysis Results
unsigned const TargetRegisterInfo * TRI
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: APFloat.h:42
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, const SparcSubtarget *Subtarget)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
amdgpu Simplify well known AMD library false Value * Callee
static SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG)
Machine Value Type.
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG)
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:69
This is an important base class in LLVM.
Definition: Constant.h:42
unsigned getExceptionSelectorRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
Extended Value Type.
Definition: ValueTypes.h:34
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
This structure contains all information that is necessary for lowering calls.
static SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG)
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:222
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Class for arbitrary precision integers.
Definition: APInt.h:70
static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG)
Representation of each machine instruction.
Definition: MachineInstr.h:64
#define I(x, y, z)
Definition: MD5.cpp:58
#define N
static SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG)
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:59
IRTranslator LLVM IR MI
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override
EVT is not used in-tree, but is used by out-of-tree target.
This file describes how to lower LLVM code to machine code.