|  | //===-- AlphaISelLowering.h - Alpha 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 Alpha uses to lower LLVM code into a | 
|  | // selection DAG. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_TARGET_ALPHA_ALPHAISELLOWERING_H | 
|  | #define LLVM_TARGET_ALPHA_ALPHAISELLOWERING_H | 
|  |  | 
|  | #include "llvm/ADT/VectorExtras.h" | 
|  | #include "llvm/Target/TargetLowering.h" | 
|  | #include "llvm/CodeGen/SelectionDAG.h" | 
|  | #include "Alpha.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | namespace AlphaISD { | 
|  | enum NodeType { | 
|  | // Start the numbering where the builting ops and target ops leave off. | 
|  | FIRST_NUMBER = ISD::BUILTIN_OP_END, | 
|  | //These corrospond to the identical Instruction | 
|  | CVTQT_, CVTQS_, CVTTQ_, | 
|  |  | 
|  | /// GPRelHi/GPRelLo - These represent the high and low 16-bit | 
|  | /// parts of a global address respectively. | 
|  | GPRelHi, GPRelLo, | 
|  |  | 
|  | /// RetLit - Literal Relocation of a Global | 
|  | RelLit, | 
|  |  | 
|  | /// GlobalRetAddr - used to restore the return address | 
|  | GlobalRetAddr, | 
|  |  | 
|  | /// CALL - Normal call. | 
|  | CALL, | 
|  |  | 
|  | /// DIVCALL - used for special library calls for div and rem | 
|  | DivCall, | 
|  |  | 
|  | /// return flag operand | 
|  | RET_FLAG, | 
|  |  | 
|  | /// CHAIN = COND_BRANCH CHAIN, OPC, (G|F)PRC, DESTBB [, INFLAG] - This | 
|  | /// corresponds to the COND_BRANCH pseudo instruction. | 
|  | /// *PRC is the input register to compare to zero, | 
|  | /// OPC is the branch opcode to use (e.g. Alpha::BEQ), | 
|  | /// DESTBB is the destination block to branch to, and INFLAG is | 
|  | /// an optional input flag argument. | 
|  | COND_BRANCH_I, COND_BRANCH_F | 
|  |  | 
|  | }; | 
|  | } | 
|  |  | 
|  | class AlphaTargetLowering : public TargetLowering { | 
|  | public: | 
|  | explicit AlphaTargetLowering(TargetMachine &TM); | 
|  |  | 
|  | virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i64; } | 
|  |  | 
|  | /// getSetCCResultType - Get the SETCC result ValueType | 
|  | virtual EVT getSetCCResultType(EVT VT) const; | 
|  |  | 
|  | /// LowerOperation - Provide custom lowering hooks for some operations. | 
|  | /// | 
|  | virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; | 
|  |  | 
|  | /// ReplaceNodeResults - Replace the results of node with an illegal result | 
|  | /// type with new values built out of custom code. | 
|  | /// | 
|  | virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, | 
|  | SelectionDAG &DAG) const; | 
|  |  | 
|  | // Friendly names for dumps | 
|  | const char *getTargetNodeName(unsigned Opcode) const; | 
|  |  | 
|  | SDValue LowerCallResult(SDValue Chain, SDValue InFlag, | 
|  | CallingConv::ID CallConv, bool isVarArg, | 
|  | const SmallVectorImpl<ISD::InputArg> &Ins, | 
|  | DebugLoc dl, SelectionDAG &DAG, | 
|  | SmallVectorImpl<SDValue> &InVals) const; | 
|  |  | 
|  | 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; | 
|  |  | 
|  | MachineBasicBlock * | 
|  | EmitInstrWithCustomInserter(MachineInstr *MI, | 
|  | MachineBasicBlock *BB) 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; | 
|  |  | 
|  | private: | 
|  | // Helpers for custom lowering. | 
|  | void LowerVAARG(SDNode *N, SDValue &Chain, SDValue &DataPtr, | 
|  | 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; | 
|  | }; | 
|  | } | 
|  |  | 
|  | #endif   // LLVM_TARGET_ALPHA_ALPHAISELLOWERING_H |