LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MSP430ISelLowering.h
Go to the documentation of this file.
1 //===-- MSP430ISelLowering.h - MSP430 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 MSP430 uses to lower LLVM code into a
11 // selection DAG.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_TARGET_MSP430_ISELLOWERING_H
16 #define LLVM_TARGET_MSP430_ISELLOWERING_H
17 
18 #include "MSP430.h"
21 
22 namespace llvm {
23  namespace MSP430ISD {
24  enum {
26 
27  /// Return with a flag operand. Operand 0 is the chain operand.
29 
30  /// Same as RET_FLAG, but used for returning from ISRs.
32 
33  /// Y = R{R,L}A X, rotate right (left) arithmetically
34  RRA, RLA,
35 
36  /// Y = RRC X, rotate right via carry
37  RRC,
38 
39  /// CALL - These operations represent an abstract call
40  /// instruction, which includes a bunch of information.
42 
43  /// Wrapper - A wrapper node for TargetConstantPool, TargetExternalSymbol,
44  /// and TargetGlobalAddress.
46 
47  /// CMP - Compare instruction.
48  CMP,
49 
50  /// SetCC - Operand 0 is condition code, and operand 1 is the flag
51  /// operand produced by a CMP instruction.
53 
54  /// MSP430 conditional branches. Operand 0 is the chain operand, operand 1
55  /// is the block to branch if condition is true, operand 2 is the
56  /// condition code, and operand 3 is the flag operand produced by a CMP
57  /// instruction.
59 
60  /// SELECT_CC - Operand 0 and operand 1 are selection variable, operand 3
61  /// is condition code and operand 4 is flag operand.
63 
64  /// SHL, SRA, SRL - Non-constant shifts.
66  };
67  }
68 
69  class MSP430Subtarget;
70  class MSP430TargetMachine;
71 
73  public:
75 
76  virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return MVT::i8; }
77 
78  /// LowerOperation - Provide custom lowering hooks for some operations.
79  virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
80 
81  /// getTargetNodeName - This method returns the name of a target specific
82  /// DAG node.
83  virtual const char *getTargetNodeName(unsigned Opcode) const;
84 
85  SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
89  SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
90  SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
95  SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
98 
100  getConstraintType(const std::string &Constraint) const;
101  std::pair<unsigned, const TargetRegisterClass*>
102  getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const;
103 
104  /// isTruncateFree - Return true if it's free to truncate a value of type
105  /// Ty1 to type Ty2. e.g. On msp430 it's free to truncate a i16 value in
106  /// register R15W to i8 by referencing its sub-register R15B.
107  virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const;
108  virtual bool isTruncateFree(EVT VT1, EVT VT2) const;
109 
110  /// isZExtFree - Return true if any actual instruction that defines a value
111  /// of type Ty1 implicit zero-extends the value to Ty2 in the result
112  /// register. This does not necessarily include registers defined in unknown
113  /// ways, such as incoming arguments, or copies from unknown virtual
114  /// registers. Also, if isTruncateFree(Ty2, Ty1) is true, this does not
115  /// necessarily apply to truncate instructions. e.g. on msp430, all
116  /// instructions that define 8-bit values implicit zero-extend the result
117  /// out to 16 bits.
118  virtual bool isZExtFree(Type *Ty1, Type *Ty2) const;
119  virtual bool isZExtFree(EVT VT1, EVT VT2) const;
120  virtual bool isZExtFree(SDValue Val, EVT VT2) const;
121 
123  MachineBasicBlock *BB) const;
125  MachineBasicBlock *BB) const;
126 
127  private:
128  SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
129  CallingConv::ID CallConv, bool isVarArg,
130  bool isTailCall,
132  const SmallVectorImpl<SDValue> &OutVals,
134  SDLoc dl, SelectionDAG &DAG,
135  SmallVectorImpl<SDValue> &InVals) const;
136 
137  SDValue LowerCCCArguments(SDValue Chain,
138  CallingConv::ID CallConv,
139  bool isVarArg,
141  SDLoc dl,
142  SelectionDAG &DAG,
143  SmallVectorImpl<SDValue> &InVals) const;
144 
145  SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
146  CallingConv::ID CallConv, bool isVarArg,
148  SDLoc dl, SelectionDAG &DAG,
149  SmallVectorImpl<SDValue> &InVals) const;
150 
151  virtual SDValue
152  LowerFormalArguments(SDValue Chain,
153  CallingConv::ID CallConv, bool isVarArg,
155  SDLoc dl, SelectionDAG &DAG,
156  SmallVectorImpl<SDValue> &InVals) const;
157  virtual SDValue
158  LowerCall(TargetLowering::CallLoweringInfo &CLI,
159  SmallVectorImpl<SDValue> &InVals) const;
160 
161  virtual SDValue
162  LowerReturn(SDValue Chain,
163  CallingConv::ID CallConv, bool isVarArg,
165  const SmallVectorImpl<SDValue> &OutVals,
166  SDLoc dl, SelectionDAG &DAG) const;
167 
168  virtual bool getPostIndexedAddressParts(SDNode *N, SDNode *Op,
169  SDValue &Base,
170  SDValue &Offset,
172  SelectionDAG &DAG) const;
173 
174  const MSP430Subtarget &Subtarget;
175  const DataLayout *TD;
176  };
177 } // namespace llvm
178 
179 #endif // LLVM_TARGET_MSP430_ISELLOWERING_H
SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const
Y = RRC X, rotate right via carry.
SHL, SRA, SRL - Non-constant shifts.
SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const
SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const
SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const
MSP430TargetLowering(MSP430TargetMachine &TM)
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *BB) const
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
LowerOperation - Provide custom lowering hooks for some operations.
TargetLowering::ConstraintType getConstraintType(const std::string &Constraint) const
Y = R{R,L}A X, rotate right (left) arithmetically.
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const
virtual MVT getScalarShiftAmountTy(EVT LHSTy) const
Same as RET_FLAG, but used for returning from ISRs.
SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const
SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const
MachineBasicBlock * EmitShiftInstr(MachineInstr *MI, MachineBasicBlock *BB) const
CMP - Compare instruction.
Return with a flag operand. Operand 0 is the chain operand.
SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const
#define N
SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const
SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const
virtual const char * getTargetNodeName(unsigned Opcode) const
virtual bool isZExtFree(Type *Ty1, Type *Ty2) const
SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const