1//===-- MBlazeISelLowering.h - MBlaze 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 MBlaze uses to lower LLVM code into a
11// selection DAG.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef MBlazeISELLOWERING_H
16#define MBlazeISELLOWERING_H
17
18#include "MBlaze.h"
19#include "MBlazeSubtarget.h"
20#include "llvm/CodeGen/SelectionDAG.h"
21#include "llvm/Support/ErrorHandling.h"
22#include "llvm/Target/TargetLowering.h"
23
24namespace llvm {
25  namespace MBlazeCC {
26    enum CC {
27      FIRST = 0,
28      EQ,
29      NE,
30      GT,
31      LT,
32      GE,
33      LE
34    };
35
36    inline static CC getOppositeCondition(CC cc) {
37      switch (cc) {
38      default: llvm_unreachable("Unknown condition code");
39      case EQ: return NE;
40      case NE: return EQ;
41      case GT: return LE;
42      case LT: return GE;
43      case GE: return LT;
44      case LE: return GE;
45      }
46    }
47
48    inline static const char *MBlazeCCToString(CC cc) {
49      switch (cc) {
50      default: llvm_unreachable("Unknown condition code");
51      case EQ: return "eq";
52      case NE: return "ne";
53      case GT: return "gt";
54      case LT: return "lt";
55      case GE: return "ge";
56      case LE: return "le";
57      }
58    }
59  }
60
61  namespace MBlazeISD {
62    enum NodeType {
63      // Start the numbering from where ISD NodeType finishes.
64      FIRST_NUMBER = ISD::BUILTIN_OP_END,
65
66      // Jump and link (call)
67      JmpLink,
68
69      // Handle gp_rel (small data/bss sections) relocation.
70      GPRel,
71
72      // Select CC Pseudo Instruction
73      Select_CC,
74
75      // Wrap up multiple types of instructions
76      Wrap,
77
78      // Integer Compare
79      ICmp,
80
81      // Return from subroutine
82      Ret,
83
84      // Return from interrupt
85      IRet
86    };
87  }
88
89  //===--------------------------------------------------------------------===//
90  // TargetLowering Implementation
91  //===--------------------------------------------------------------------===//
92
93  class MBlazeTargetLowering : public TargetLowering  {
94  public:
95    explicit MBlazeTargetLowering(MBlazeTargetMachine &TM);
96
97    /// LowerOperation - Provide custom lowering hooks for some operations.
98    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
99
100    /// getTargetNodeName - This method returns the name of a target specific
101    //  DAG node.
102    virtual const char *getTargetNodeName(unsigned Opcode) const;
103
104    /// getSetCCResultType - get the ISD::SETCC result ValueType
105    EVT getSetCCResultType(EVT VT) const;
106
107  private:
108    // Subtarget Info
109    const MBlazeSubtarget *Subtarget;
110
111
112    // Lower Operand helpers
113    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
114                            CallingConv::ID CallConv, bool isVarArg,
115                            const SmallVectorImpl<ISD::InputArg> &Ins,
116                            DebugLoc dl, SelectionDAG &DAG,
117                            SmallVectorImpl<SDValue> &InVals) const;
118
119    // Lower Operand specifics
120    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
121    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
122    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
123    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
124    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
125    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
126
127    virtual SDValue
128      LowerFormalArguments(SDValue Chain,
129                           CallingConv::ID CallConv, bool isVarArg,
130                           const SmallVectorImpl<ISD::InputArg> &Ins,
131                           DebugLoc dl, SelectionDAG &DAG,
132                           SmallVectorImpl<SDValue> &InVals) const;
133
134    virtual SDValue
135      LowerCall(TargetLowering::CallLoweringInfo &CLI,
136                SmallVectorImpl<SDValue> &InVals) const;
137
138    virtual SDValue
139      LowerReturn(SDValue Chain,
140                  CallingConv::ID CallConv, bool isVarArg,
141                  const SmallVectorImpl<ISD::OutputArg> &Outs,
142                  const SmallVectorImpl<SDValue> &OutVals,
143                  DebugLoc dl, SelectionDAG &DAG) const;
144
145    virtual MachineBasicBlock*
146      EmitCustomShift(MachineInstr *MI, MachineBasicBlock *MBB) const;
147
148    virtual MachineBasicBlock*
149      EmitCustomSelect(MachineInstr *MI, MachineBasicBlock *MBB) const;
150
151    virtual MachineBasicBlock*
152            EmitCustomAtomic(MachineInstr *MI, MachineBasicBlock *MBB) const;
153
154    virtual MachineBasicBlock *
155      EmitInstrWithCustomInserter(MachineInstr *MI,
156                                  MachineBasicBlock *MBB) const;
157
158    // Inline asm support
159    ConstraintType getConstraintType(const std::string &Constraint) const;
160
161    /// Examine constraint string and operand type and determine a weight value.
162    /// The operand object must already have been set up with the operand type.
163    ConstraintWeight getSingleConstraintMatchWeight(
164      AsmOperandInfo &info, const char *constraint) const;
165
166    std::pair<unsigned, const TargetRegisterClass*>
167              getRegForInlineAsmConstraint(const std::string &Constraint,
168              EVT VT) const;
169
170    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
171
172    /// isFPImmLegal - Returns true if the target can instruction select the
173    /// specified FP immediate natively. If false, the legalizer will
174    /// materialize the FP immediate as a load from a constant pool.
175    virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
176  };
177}
178
179#endif // MBlazeISELLOWERING_H
180