1 //===-- R600ISelLowering.h - R600 DAG Lowering Interface -*- C++ -*--------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief R600 DAG Lowering interface definition
13 //===----------------------------------------------------------------------===//
15 #ifndef R600ISELLOWERING_H
16 #define R600ISELLOWERING_H
18 #include "AMDGPUISelLowering.h"
24 class R600TargetLowering : public AMDGPUTargetLowering {
26 R600TargetLowering(TargetMachine &TM);
27 virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr *MI,
28 MachineBasicBlock * BB) const;
29 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
30 virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
31 void ReplaceNodeResults(SDNode * N,
32 SmallVectorImpl<SDValue> &Results,
33 SelectionDAG &DAG) const;
34 virtual SDValue LowerFormalArguments(
36 CallingConv::ID CallConv,
38 const SmallVectorImpl<ISD::InputArg> &Ins,
39 SDLoc DL, SelectionDAG &DAG,
40 SmallVectorImpl<SDValue> &InVals) const;
41 virtual EVT getSetCCResultType(LLVMContext &, EVT VT) const;
43 const R600InstrInfo * TII;
45 /// Each OpenCL kernel has nine implicit parameters that are stored in the
46 /// first nine dwords of a Vertex Buffer. These implicit parameters are
47 /// lowered to load instructions which retreive the values from the Vertex
49 SDValue LowerImplicitParameter(SelectionDAG &DAG, EVT VT,
50 SDLoc DL, unsigned DwordOffset) const;
52 void lowerImplicitParameter(MachineInstr *MI, MachineBasicBlock &BB,
53 MachineRegisterInfo & MRI, unsigned dword_offset) const;
55 /// \brief Lower ROTL opcode to BITALIGN
56 SDValue LowerROTL(SDValue Op, SelectionDAG &DAG) const;
58 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
59 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
60 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
61 SDValue LowerFPTOUINT(SDValue Op, SelectionDAG &DAG) const;
62 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
63 SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
65 SDValue stackPtrToRegIndex(SDValue Ptr, unsigned StackWidth,
66 SelectionDAG &DAG) const;
67 void getStackAddress(unsigned StackWidth, unsigned ElemIdx,
68 unsigned &Channel, unsigned &PtrIncr) const;
69 bool isZero(SDValue Op) const;
72 } // End namespace llvm;
74 #endif // R600ISELLOWERING_H