1*9880d681SAndroid Build Coastguard Worker //===-- R600ISelLowering.h - R600 DAG Lowering Interface -*- C++ -*--------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker /// \file 11*9880d681SAndroid Build Coastguard Worker /// \brief R600 DAG Lowering interface definition 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AMDGPU_R600ISELLOWERING_H 16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AMDGPU_R600ISELLOWERING_H 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #include "AMDGPUISelLowering.h" 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker namespace llvm { 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker class R600InstrInfo; 23*9880d681SAndroid Build Coastguard Worker class R600Subtarget; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker class R600TargetLowering final : public AMDGPUTargetLowering { 26*9880d681SAndroid Build Coastguard Worker public: 27*9880d681SAndroid Build Coastguard Worker R600TargetLowering(const TargetMachine &TM, const R600Subtarget &STI); 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker const R600Subtarget *getSubtarget() const; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker MachineBasicBlock * 32*9880d681SAndroid Build Coastguard Worker EmitInstrWithCustomInserter(MachineInstr &MI, 33*9880d681SAndroid Build Coastguard Worker MachineBasicBlock *BB) const override; 34*9880d681SAndroid Build Coastguard Worker SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 35*9880d681SAndroid Build Coastguard Worker SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override; 36*9880d681SAndroid Build Coastguard Worker void ReplaceNodeResults(SDNode * N, 37*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<SDValue> &Results, 38*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const override; 39*9880d681SAndroid Build Coastguard Worker SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, 40*9880d681SAndroid Build Coastguard Worker bool isVarArg, 41*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<ISD::InputArg> &Ins, 42*9880d681SAndroid Build Coastguard Worker const SDLoc &DL, SelectionDAG &DAG, 43*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<SDValue> &InVals) const override; 44*9880d681SAndroid Build Coastguard Worker EVT getSetCCResultType(const DataLayout &DL, LLVMContext &, 45*9880d681SAndroid Build Coastguard Worker EVT VT) const override; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, 48*9880d681SAndroid Build Coastguard Worker unsigned Align, 49*9880d681SAndroid Build Coastguard Worker bool *IsFast) const override; 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker private: 52*9880d681SAndroid Build Coastguard Worker unsigned Gen; 53*9880d681SAndroid Build Coastguard Worker /// Each OpenCL kernel has nine implicit parameters that are stored in the 54*9880d681SAndroid Build Coastguard Worker /// first nine dwords of a Vertex Buffer. These implicit parameters are 55*9880d681SAndroid Build Coastguard Worker /// lowered to load instructions which retrieve the values from the Vertex 56*9880d681SAndroid Build Coastguard Worker /// Buffer. 57*9880d681SAndroid Build Coastguard Worker SDValue LowerImplicitParameter(SelectionDAG &DAG, EVT VT, const SDLoc &DL, 58*9880d681SAndroid Build Coastguard Worker unsigned DwordOffset) const; 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker void lowerImplicitParameter(MachineInstr *MI, MachineBasicBlock &BB, 61*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo & MRI, unsigned dword_offset) const; 62*9880d681SAndroid Build Coastguard Worker SDValue OptimizeSwizzle(SDValue BuildVector, SDValue Swz[], SelectionDAG &DAG, 63*9880d681SAndroid Build Coastguard Worker const SDLoc &DL) const; 64*9880d681SAndroid Build Coastguard Worker SDValue vectorToVerticalVector(SelectionDAG &DAG, SDValue Vector) const; 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker SDValue lowerFrameIndex(SDValue Op, SelectionDAG &DAG) const; 67*9880d681SAndroid Build Coastguard Worker SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; 68*9880d681SAndroid Build Coastguard Worker SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; 69*9880d681SAndroid Build Coastguard Worker SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op, 70*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const override; 71*9880d681SAndroid Build Coastguard Worker SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker SDValue lowerPrivateTruncStore(StoreSDNode *Store, SelectionDAG &DAG) const; 74*9880d681SAndroid Build Coastguard Worker SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 75*9880d681SAndroid Build Coastguard Worker SDValue LowerFPTOUINT(SDValue Op, SelectionDAG &DAG) const; 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker SDValue lowerPrivateExtLoad(SDValue Op, SelectionDAG &DAG) const; 78*9880d681SAndroid Build Coastguard Worker SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 79*9880d681SAndroid Build Coastguard Worker SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const; 80*9880d681SAndroid Build Coastguard Worker SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const; 81*9880d681SAndroid Build Coastguard Worker SDValue LowerSHLParts(SDValue Op, SelectionDAG &DAG) const; 82*9880d681SAndroid Build Coastguard Worker SDValue LowerSRXParts(SDValue Op, SelectionDAG &DAG) const; 83*9880d681SAndroid Build Coastguard Worker SDValue LowerUADDSUBO(SDValue Op, SelectionDAG &DAG, 84*9880d681SAndroid Build Coastguard Worker unsigned mainop, unsigned ovf) const; 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker SDValue stackPtrToRegIndex(SDValue Ptr, unsigned StackWidth, 87*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const; 88*9880d681SAndroid Build Coastguard Worker void getStackAddress(unsigned StackWidth, unsigned ElemIdx, 89*9880d681SAndroid Build Coastguard Worker unsigned &Channel, unsigned &PtrIncr) const; 90*9880d681SAndroid Build Coastguard Worker bool isZero(SDValue Op) const; 91*9880d681SAndroid Build Coastguard Worker bool isHWTrueValue(SDValue Op) const; 92*9880d681SAndroid Build Coastguard Worker bool isHWFalseValue(SDValue Op) const; 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker bool FoldOperand(SDNode *ParentNode, unsigned SrcIdx, SDValue &Src, 95*9880d681SAndroid Build Coastguard Worker SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm, 96*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const override; 99*9880d681SAndroid Build Coastguard Worker }; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker } // End namespace llvm; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker #endif 104