|  | //==-- SystemZISelLowering.h - SystemZ 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 SystemZ uses to lower LLVM code into a | 
|  | // selection DAG. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_TARGET_SystemZ_ISELLOWERING_H | 
|  | #define LLVM_TARGET_SystemZ_ISELLOWERING_H | 
|  |  | 
|  | #include "SystemZ.h" | 
|  | #include "SystemZRegisterInfo.h" | 
|  | #include "llvm/CodeGen/SelectionDAG.h" | 
|  | #include "llvm/Target/TargetLowering.h" | 
|  |  | 
|  | namespace llvm { | 
|  | namespace SystemZISD { | 
|  | enum { | 
|  | FIRST_NUMBER = ISD::BUILTIN_OP_END, | 
|  |  | 
|  | /// Return with a flag operand. Operand 0 is the chain operand. | 
|  | RET_FLAG, | 
|  |  | 
|  | /// CALL - These operations represent an abstract call | 
|  | /// instruction, which includes a bunch of information. | 
|  | CALL, | 
|  |  | 
|  | /// PCRelativeWrapper - PC relative address | 
|  | PCRelativeWrapper, | 
|  |  | 
|  | /// CMP, UCMP - Compare instruction | 
|  | CMP, | 
|  | UCMP, | 
|  |  | 
|  | /// BRCOND - Conditional branch. Operand 0 is chain operand, operand 1 is | 
|  | /// the block to branch if condition is true, operand 2 is condition code | 
|  | /// and operand 3 is the flag operand produced by a CMP instruction. | 
|  | BRCOND, | 
|  |  | 
|  | /// SELECT - Operands 0 and 1 are selection variables, operand 2 is | 
|  | /// condition code and operand 3 is the flag operand. | 
|  | SELECT | 
|  | }; | 
|  | } | 
|  |  | 
|  | class SystemZSubtarget; | 
|  | class SystemZTargetMachine; | 
|  |  | 
|  | class SystemZTargetLowering : public TargetLowering { | 
|  | public: | 
|  | explicit SystemZTargetLowering(SystemZTargetMachine &TM); | 
|  |  | 
|  | virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i64; } | 
|  |  | 
|  | /// 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; | 
|  |  | 
|  | std::pair<unsigned, const TargetRegisterClass*> | 
|  | getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const; | 
|  | TargetLowering::ConstraintType | 
|  | getConstraintType(const std::string &Constraint) const; | 
|  |  | 
|  | SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; | 
|  | SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; | 
|  | SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; | 
|  | SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; | 
|  | SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; | 
|  |  | 
|  | SDValue EmitCmp(SDValue LHS, SDValue RHS, | 
|  | ISD::CondCode CC, SDValue &SystemZCC, | 
|  | SelectionDAG &DAG) const; | 
|  |  | 
|  |  | 
|  | MachineBasicBlock* EmitInstrWithCustomInserter(MachineInstr *MI, | 
|  | MachineBasicBlock *BB) 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: | 
|  | SDValue LowerCCCCallTo(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; | 
|  |  | 
|  | SDValue LowerCCCArguments(SDValue Chain, | 
|  | CallingConv::ID CallConv, | 
|  | bool isVarArg, | 
|  | const SmallVectorImpl<ISD::InputArg> &Ins, | 
|  | DebugLoc dl, | 
|  | SelectionDAG &DAG, | 
|  | SmallVectorImpl<SDValue> &InVals) 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; | 
|  |  | 
|  | 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; | 
|  |  | 
|  | const SystemZSubtarget &Subtarget; | 
|  | const SystemZTargetMachine &TM; | 
|  | const SystemZRegisterInfo *RegInfo; | 
|  | }; | 
|  | } // namespace llvm | 
|  |  | 
|  | #endif // LLVM_TARGET_SystemZ_ISELLOWERING_H |