//===-- MBlazeISelLowering.h - MBlaze DAG Lowering Interface ----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the interfaces that MBlaze uses to lower LLVM code into a // selection DAG. // //===----------------------------------------------------------------------===// #ifndef MBlazeISELLOWERING_H #define MBlazeISELLOWERING_H #include "llvm/Support/ErrorHandling.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Target/TargetLowering.h" #include "MBlaze.h" #include "MBlazeSubtarget.h" namespace llvm { namespace MBlazeCC { enum CC { FIRST = 0, EQ, NE, GT, LT, GE, LE }; inline static CC getOppositeCondition(CC cc) { switch (cc) { default: llvm_unreachable("Unknown condition code"); case EQ: return NE; case NE: return EQ; case GT: return LE; case LT: return GE; case GE: return LT; case LE: return GE; } } inline static const char *MBlazeCCToString(CC cc) { switch (cc) { default: llvm_unreachable("Unknown condition code"); case EQ: return "eq"; case NE: return "ne"; case GT: return "gt"; case LT: return "lt"; case GE: return "ge"; case LE: return "le"; } } } namespace MBlazeISD { enum NodeType { // Start the numbering from where ISD NodeType finishes. FIRST_NUMBER = ISD::BUILTIN_OP_END, // Jump and link (call) JmpLink, // Handle gp_rel (small data/bss sections) relocation. GPRel, // Select CC Pseudo Instruction Select_CC, // Wrap up multiple types of instructions Wrap, // Integer Compare ICmp, // Return from subroutine Ret, // Return from interrupt IRet }; } //===--------------------------------------------------------------------===// // TargetLowering Implementation //===--------------------------------------------------------------------===// class MBlazeTargetLowering : public TargetLowering { public: explicit MBlazeTargetLowering(MBlazeTargetMachine &TM); /// LowerOperation - Provide custom lowering hooks for some operations. virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; /// getTargetNodeName - This method returns the name of a target specific // DAG node. virtual const char *getTargetNodeName(unsigned Opcode) const; /// getSetCCResultType - get the ISD::SETCC result ValueType EVT getSetCCResultType(EVT VT) const; private: // Subtarget Info const MBlazeSubtarget *Subtarget; // Lower Operand helpers SDValue LowerCallResult(SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl<ISD::InputArg> &Ins, DebugLoc dl, SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const; // Lower Operand specifics SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; virtual SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl<ISD::InputArg> &Ins, DebugLoc dl, SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const; virtual SDValue LowerCall(SDValue Chain, SDValue Callee, CallingConv::ID CallConv, bool isVarArg, bool &isTailCall, const SmallVectorImpl<ISD::OutputArg> &Outs, const SmallVectorImpl<SDValue> &OutVals, const SmallVectorImpl<ISD::InputArg> &Ins, DebugLoc dl, SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const; virtual SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl<ISD::OutputArg> &Outs, const SmallVectorImpl<SDValue> &OutVals, DebugLoc dl, SelectionDAG &DAG) const; virtual MachineBasicBlock* EmitCustomShift(MachineInstr *MI, MachineBasicBlock *MBB) const; virtual MachineBasicBlock* EmitCustomSelect(MachineInstr *MI, MachineBasicBlock *MBB) const; virtual MachineBasicBlock* EmitCustomAtomic(MachineInstr *MI, MachineBasicBlock *MBB) const; virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const; // Inline asm support ConstraintType getConstraintType(const std::string &Constraint) const; /// Examine constraint string and operand type and determine a weight value. /// The operand object must already have been set up with the operand type. ConstraintWeight getSingleConstraintMatchWeight( AsmOperandInfo &info, const char *constraint) const; std::pair<unsigned, const TargetRegisterClass*> getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const; virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const; /// isFPImmLegal - Returns true if the target can instruction select the /// specified FP immediate natively. If false, the legalizer will /// materialize the FP immediate as a load from a constant pool. virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const; }; } #endif // MBlazeISELLOWERING_H