1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- SIISelLowering.h - SI DAG Lowering Interface ------------*- C++ -*-===// 2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// 3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// The LLVM Compiler Infrastructure 4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// 5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// This file is distributed under the University of Illinois Open Source 6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// License. See LICENSE.TXT for details. 7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// 8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===// 9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// 10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \file 11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \brief SI DAG Lowering interface definition 12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// 13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===// 14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_R600_SIISELLOWERING_H 1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_R600_SIISELLOWERING_H 17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUISelLowering.h" 19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "SIInstrInfo.h" 20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace llvm { 22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass SITargetLowering : public AMDGPUTargetLowering { 24f95b1621887e3409ceec2db47e1b44271d934735Tom Stellard SDValue LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT, SDLoc DL, 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDValue Chain, unsigned Offset, bool Signed) const; 2668db37b952be497c94c7aa98cf26f3baadb5afd3Tom Stellard SDValue LowerSampleIntrinsic(unsigned Opcode, const SDValue &Op, 2768db37b952be497c94c7aa98cf26f3baadb5afd3Tom Stellard SelectionDAG &DAG) const; 2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op, 2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SelectionDAG &DAG) const override; 3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const; 3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const; 34a2b4eb6d15a13de257319ac6231b5ab622cd02b1Tom Stellard SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const; 3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerFastFDIV(SDValue Op, SelectionDAG &DAG) const; 3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerFDIV32(SDValue Op, SelectionDAG &DAG) const; 3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerFDIV64(SDValue Op, SelectionDAG &DAG) const; 3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const; 4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG, bool Signed) const; 41a2b4eb6d15a13de257319ac6231b5ab622cd02b1Tom Stellard SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const; 436b7d99d47321ebb478b22afd2e317fe89d2149dbTom Stellard SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const; 44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 4584a775d8e3d5a3765e01db4b454f849ed8be99beChristian Konig void adjustWritemask(MachineSDNode *&N, SelectionDAG &DAG) const; 4684a775d8e3d5a3765e01db4b454f849ed8be99beChristian Konig 47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue performUCharToFloatCombine(SDNode *N, 48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DAGCombinerInfo &DCI) const; 4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue performSHLPtrCombine(SDNode *N, 5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned AS, 5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DAGCombinerInfo &DCI) const; 52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue performAndCombine(SDNode *N, DAGCombinerInfo &DCI) const; 53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue performOrCombine(SDNode *N, DAGCombinerInfo &DCI) const; 54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue performClassCombine(SDNode *N, DAGCombinerInfo &DCI) const; 5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue performMin3Max3Combine(SDNode *N, DAGCombinerInfo &DCI) const; 57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue performSetCCCombine(SDNode *N, DAGCombinerInfo &DCI) const; 58c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardpublic: 60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SITargetLowering(TargetMachine &tm, const AMDGPUSubtarget &STI); 6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isShuffleMaskLegal(const SmallVectorImpl<int> &/*Mask*/, 6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EVT /*VT*/) const override; 6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isLegalAddressingMode(const AddrMode &AM, 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Type *Ty) const override; 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, 6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Align, 7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool *IsFast) const override; 7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign, 7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned SrcAlign, bool IsMemset, 7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool ZeroMemset, 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool MemcpyStrSrc, 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineFunction &MF) const override; 77c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 78c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines TargetLoweringBase::LegalizeTypeAction 79c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines getPreferredVectorAction(EVT VT) const override; 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool shouldConvertConstantLoadToIntImm(const APInt &Imm, 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Type *Ty) const override; 8390c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig 8490c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, 8590c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig bool isVarArg, 8690c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig const SmallVectorImpl<ISD::InputArg> &Ins, 87ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL, SelectionDAG &DAG, 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVectorImpl<SDValue> &InVals) const override; 8990c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr * MI, 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineBasicBlock * BB) const override; 92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool enableAggressiveFMAFusion(EVT VT) const override; 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override; 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MVT getScalarShiftAmountTy(EVT VT) const override; 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isFMAFasterThanFMulAndFAdd(EVT VT) const override; 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override; 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const override; 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void AdjustInstrPostInstrSelection(MachineInstr *MI, 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDNode *Node) const override; 101d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig 102d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig int32_t analyzeImmediate(const SDNode *N) const; 103e5fcc0dee4b41658986047f346201ad98757e7d5Tom Stellard SDValue CreateLiveInRegister(SelectionDAG &DAG, const TargetRegisterClass *RC, 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned Reg, EVT VT) const override; 10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void legalizeTargetIndependentNode(SDNode *Node, SelectionDAG &DAG) const; 10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 10737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineSDNode *wrapAddr64Rsrc(SelectionDAG &DAG, SDLoc DL, SDValue Ptr) const; 10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineSDNode *buildRSRC(SelectionDAG &DAG, 10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDLoc DL, 11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue Ptr, 11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t RsrcDword1, 11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t RsrcDword2And3) const; 11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineSDNode *buildScratchRSRC(SelectionDAG &DAG, 11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDLoc DL, 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SDValue Ptr) const; 1162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar 1172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::pair<unsigned, const TargetRegisterClass *> getRegForInlineAsmConstraint( 1182c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const TargetRegisterInfo *TRI, 1192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const std::string &Constraint, MVT VT) const override; 120f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}; 121f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 122f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} // End namespace llvm 123f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif 125