MSP430ISelLowering.h revision 20c568f366be211323eeaf0e45ef053278ec9ddc
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"
19#include "llvm/CodeGen/SelectionDAG.h"
20#include "llvm/Target/TargetLowering.h"
21
22namespace llvm {
23  namespace MSP430ISD {
24    enum {
25      FIRST_NUMBER = ISD::BUILTIN_OP_END,
26
27      /// Return with a flag operand. Operand 0 is the chain operand.
28      RET_FLAG,
29
30      /// Y = R{R,L}A X, rotate right (left) arithmetically
31      RRA, RLA,
32
33      /// Y = RRC X, rotate right via carry
34      RRC,
35
36      /// CALL/TAILCALL - These operations represent an abstract call
37      /// instruction, which includes a bunch of information.
38      CALL,
39
40      /// Wrapper - A wrapper node for TargetConstantPool, TargetExternalSymbol,
41      /// and TargetGlobalAddress.
42      Wrapper,
43
44      /// CMP - Compare instruction.
45      CMP,
46
47      /// SetCC. Operand 0 is condition code, and operand 1 is the flag
48      /// operand produced by a CMP instruction.
49      SETCC,
50
51      /// MSP430 conditional branches. Operand 0 is the chain operand, operand 1
52      /// is the block to branch if condition is true, operand 2 is the
53      /// condition code, and operand 3 is the flag operand produced by a CMP
54      /// instruction.
55      BR_CC,
56
57      /// SELECT_CC. Operand 0 and operand 1 are selection variable, operand 3
58      /// is condition code and operand 4 is flag operand.
59      SELECT_CC
60    };
61  }
62
63  class MSP430Subtarget;
64  class MSP430TargetMachine;
65
66  class MSP430TargetLowering : public TargetLowering {
67  public:
68    explicit MSP430TargetLowering(MSP430TargetMachine &TM);
69
70    /// LowerOperation - Provide custom lowering hooks for some operations.
71    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
72
73    /// getTargetNodeName - This method returns the name of a target specific
74    /// DAG node.
75    virtual const char *getTargetNodeName(unsigned Opcode) const;
76
77    /// getFunctionAlignment - Return the alignment of this function.
78    virtual unsigned getFunctionAlignment(const Function *F) const;
79
80    SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
81    SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
82    SDValue LowerRET(SDValue Op, SelectionDAG &DAG);
83    SDValue LowerCCCArguments(SDValue Op, SelectionDAG &DAG);
84    SDValue LowerShifts(SDValue Op, SelectionDAG &DAG);
85    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
86    SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG);
87    SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG);
88    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG);
89    SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG);
90
91    SDValue LowerCCCCallTo(SDValue Op, SelectionDAG &DAG,
92                           unsigned CC);
93    SDNode* LowerCallResult(SDValue Chain, SDValue InFlag,
94                            CallSDNode *TheCall,
95                            unsigned CallingConv, SelectionDAG &DAG);
96
97    MachineBasicBlock* EmitInstrWithCustomInserter(MachineInstr *MI,
98                                                   MachineBasicBlock *BB) const;
99
100  private:
101    const MSP430Subtarget &Subtarget;
102    const MSP430TargetMachine &TM;
103  };
104} // namespace llvm
105
106#endif // LLVM_TARGET_MSP430_ISELLOWERING_H
107