| //===-- SPUISelLowering.h - Cell SPU 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 Cell SPU uses to lower LLVM code into | |
| // a selection DAG. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef SPU_ISELLOWERING_H | |
| #define SPU_ISELLOWERING_H | |
| #include "llvm/Target/TargetLowering.h" | |
| #include "llvm/CodeGen/SelectionDAG.h" | |
| #include "SPU.h" | |
| namespace llvm { | |
| namespace SPUISD { | |
| enum NodeType { | |
| // Start the numbering where the builting ops and target ops leave off. | |
| FIRST_NUMBER = ISD::BUILTIN_OP_END, | |
| // Pseudo instructions: | |
| RET_FLAG, ///< Return with flag, matched by bi instruction | |
| Hi, ///< High address component (upper 16) | |
| Lo, ///< Low address component (lower 16) | |
| PCRelAddr, ///< Program counter relative address | |
| AFormAddr, ///< A-form address (local store) | |
| IndirectAddr, ///< D-Form "imm($r)" and X-form "$r($r)" | |
| LDRESULT, ///< Load result (value, chain) | |
| CALL, ///< CALL instruction | |
| SHUFB, ///< Vector shuffle (permute) | |
| SHUFFLE_MASK, ///< Shuffle mask | |
| CNTB, ///< Count leading ones in bytes | |
| PREFSLOT2VEC, ///< Promote scalar->vector | |
| VEC2PREFSLOT, ///< Extract element 0 | |
| SHL_BITS, ///< Shift quad left, by bits | |
| SHL_BYTES, ///< Shift quad left, by bytes | |
| SRL_BYTES, ///< Shift quad right, by bytes. Insert zeros. | |
| VEC_ROTL, ///< Vector rotate left | |
| VEC_ROTR, ///< Vector rotate right | |
| ROTBYTES_LEFT, ///< Rotate bytes (loads -> ROTQBYI) | |
| ROTBYTES_LEFT_BITS, ///< Rotate bytes left by bit shift count | |
| SELECT_MASK, ///< Select Mask (FSM, FSMB, FSMH, FSMBI) | |
| SELB, ///< Select bits -> (b & mask) | (a & ~mask) | |
| // Markers: These aren't used to generate target-dependent nodes, but | |
| // are used during instruction selection. | |
| ADD64_MARKER, ///< i64 addition marker | |
| SUB64_MARKER, ///< i64 subtraction marker | |
| MUL64_MARKER, ///< i64 multiply marker | |
| LAST_SPUISD ///< Last user-defined instruction | |
| }; | |
| } | |
| //! Utility functions specific to CellSPU: | |
| namespace SPU { | |
| SDValue get_vec_u18imm(SDNode *N, SelectionDAG &DAG, | |
| EVT ValueType); | |
| SDValue get_vec_i16imm(SDNode *N, SelectionDAG &DAG, | |
| EVT ValueType); | |
| SDValue get_vec_i10imm(SDNode *N, SelectionDAG &DAG, | |
| EVT ValueType); | |
| SDValue get_vec_i8imm(SDNode *N, SelectionDAG &DAG, | |
| EVT ValueType); | |
| SDValue get_ILHUvec_imm(SDNode *N, SelectionDAG &DAG, | |
| EVT ValueType); | |
| SDValue get_v4i32_imm(SDNode *N, SelectionDAG &DAG); | |
| SDValue get_v2i64_imm(SDNode *N, SelectionDAG &DAG); | |
| SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG, | |
| const SPUTargetMachine &TM); | |
| //! Simplify a EVT::v2i64 constant splat to CellSPU-ready form | |
| SDValue LowerV2I64Splat(EVT OpVT, SelectionDAG &DAG, uint64_t splat, | |
| DebugLoc dl); | |
| } | |
| class SPUTargetMachine; // forward dec'l. | |
| class SPUTargetLowering : | |
| public TargetLowering | |
| { | |
| int VarArgsFrameIndex; // FrameIndex for start of varargs area. | |
| SPUTargetMachine &SPUTM; | |
| public: | |
| //! The venerable constructor | |
| /*! | |
| This is where the CellSPU backend sets operation handling (i.e., legal, | |
| custom, expand or promote.) | |
| */ | |
| SPUTargetLowering(SPUTargetMachine &TM); | |
| //! Get the target machine | |
| SPUTargetMachine &getSPUTargetMachine() { | |
| return SPUTM; | |
| } | |
| /// getTargetNodeName() - This method returns the name of a target specific | |
| /// DAG node. | |
| virtual const char *getTargetNodeName(unsigned Opcode) const; | |
| /// getSetCCResultType - Return the ValueType for ISD::SETCC | |
| virtual EVT getSetCCResultType(EVT VT) const; | |
| virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i32; } | |
| //! Custom lowering hooks | |
| virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; | |
| //! Custom lowering hook for nodes with illegal result types. | |
| virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, | |
| SelectionDAG &DAG) const; | |
| virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; | |
| virtual void computeMaskedBitsForTargetNode(const SDValue Op, | |
| const APInt &Mask, | |
| APInt &KnownZero, | |
| APInt &KnownOne, | |
| const SelectionDAG &DAG, | |
| unsigned Depth = 0) const; | |
| virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, | |
| unsigned Depth = 0) const; | |
| ConstraintType getConstraintType(const std::string &ConstraintLetter) 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; | |
| void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint, | |
| std::vector<SDValue> &Ops, | |
| SelectionDAG &DAG) const; | |
| /// isLegalAddressImmediate - Return true if the integer value can be used | |
| /// as the offset of the target addressing mode. | |
| virtual bool isLegalAddressImmediate(int64_t V, Type *Ty) const; | |
| virtual bool isLegalAddressImmediate(GlobalValue *) const; | |
| virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) 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 bool isLegalICmpImmediate(int64_t Imm) const; | |
| virtual bool isLegalAddressingMode(const AddrMode &AM, | |
| Type *Ty) const; | |
| }; | |
| } | |
| #endif |