1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- R600ISelLowering.h - R600 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 R600 DAG Lowering interface definition
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===//
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#ifndef R600ISELLOWERING_H
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#define R600ISELLOWERING_H
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUISelLowering.h"
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace llvm {
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass R600InstrInfo;
23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass R600TargetLowering : public AMDGPUTargetLowering {
25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardpublic:
26f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  R600TargetLowering(TargetMachine &TM);
27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr *MI,
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      MachineBasicBlock * BB) const;
29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
31f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  void ReplaceNodeResults(SDNode * N,
32f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      SmallVectorImpl<SDValue> &Results,
33f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      SelectionDAG &DAG) const;
34f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual SDValue LowerFormalArguments(
35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                      SDValue Chain,
36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                      CallingConv::ID CallConv,
37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                      bool isVarArg,
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                      const SmallVectorImpl<ISD::InputArg> &Ins,
39ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                      SDLoc DL, SelectionDAG &DAG,
40f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                      SmallVectorImpl<SDValue> &InVals) const;
41225ed7069caae9ece32d8bd3d15c6e41e21cc04bMatt Arsenault  virtual EVT getSetCCResultType(LLVMContext &, EVT VT) const;
42f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardprivate:
43c6f13db656c7649f933c74c4f90c09ff74de52a8Vincent Lejeune  unsigned Gen;
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  /// Each OpenCL kernel has nine implicit parameters that are stored in the
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  /// first nine dwords of a Vertex Buffer.  These implicit parameters are
46f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  /// lowered to load instructions which retreive the values from the Vertex
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  /// Buffer.
48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerImplicitParameter(SelectionDAG &DAG, EVT VT,
49ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                 SDLoc DL, unsigned DwordOffset) const;
50f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
51f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  void lowerImplicitParameter(MachineInstr *MI, MachineBasicBlock &BB,
52f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard      MachineRegisterInfo & MRI, unsigned dword_offset) const;
5398017a015bb862afce4f90d432eded4e28fe1d26Vincent Lejeune  SDValue OptimizeSwizzle(SDValue BuildVector, SDValue Swz[], SelectionDAG &DAG) const;
54f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  /// \brief Lower ROTL opcode to BITALIGN
56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerROTL(SDValue Op, SelectionDAG &DAG) const;
57f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
58f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
60f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
61f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerFPTOUINT(SDValue Op, SelectionDAG &DAG) const;
629f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
63c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard  SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
64c6f13db656c7649f933c74c4f90c09ff74de52a8Vincent Lejeune  SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
65c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard
66c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard  SDValue stackPtrToRegIndex(SDValue Ptr, unsigned StackWidth,
67c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard                                          SelectionDAG &DAG) const;
68c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard  void getStackAddress(unsigned StackWidth, unsigned ElemIdx,
69c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard                       unsigned &Channel, unsigned &PtrIncr) const;
70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  bool isZero(SDValue Op) const;
71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard};
72f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} // End namespace llvm;
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#endif // R600ISELLOWERING_H
76