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