SIISelLowering.h revision f95b1621887e3409ceec2db47e1b44271d934735
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
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#ifndef SIISELLOWERING_H
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#define 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,
25e5fcc0dee4b41658986047f346201ad98757e7d5Tom Stellard                         SDValue Chain, unsigned Offset) const;
2668db37b952be497c94c7aa98cf26f3baadb5afd3Tom Stellard  SDValue LowerSampleIntrinsic(unsigned Opcode, const SDValue &Op,
2768db37b952be497c94c7aa98cf26f3baadb5afd3Tom Stellard                               SelectionDAG &DAG) const;
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
29e86f9d70ca29429ea83bc2361cf908dc566783afTom Stellard  SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
308cd70d3a5bbc5c2b02d288337748a4fd5ddc9f54Tom Stellard  SDValue LowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const;
316b7d99d47321ebb478b22afd2e317fe89d2149dbTom Stellard  SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
32f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
3368db37b952be497c94c7aa98cf26f3baadb5afd3Tom Stellard  SDValue ResourceDescriptorToi128(SDValue Op, SelectionDAG &DAG) const;
34d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig  bool foldImm(SDValue &Operand, int32_t &Immediate,
35d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig               bool &ScalarSlotUsed) const;
363406d882c02a6cd1e16f4636351c23dcb68d785fTom Stellard  const TargetRegisterClass *getRegClassForNode(SelectionDAG &DAG,
373406d882c02a6cd1e16f4636351c23dcb68d785fTom Stellard                                                const SDValue &Op) const;
389bf4590aaa26ebb5afdbec079daeee8e0b268b47Tom Stellard  bool fitsRegClass(SelectionDAG &DAG, const SDValue &Op,
399bf4590aaa26ebb5afdbec079daeee8e0b268b47Tom Stellard                    unsigned RegClass) const;
40225ed7069caae9ece32d8bd3d15c6e41e21cc04bMatt Arsenault  void ensureSRegLimit(SelectionDAG &DAG, SDValue &Operand,
41d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig                       unsigned RegClass, bool &ScalarSlotUsed) const;
42d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig
4384a775d8e3d5a3765e01db4b454f849ed8be99beChristian Konig  SDNode *foldOperands(MachineSDNode *N, SelectionDAG &DAG) const;
4484a775d8e3d5a3765e01db4b454f849ed8be99beChristian Konig  void adjustWritemask(MachineSDNode *&N, SelectionDAG &DAG) const;
4517e8ad67f0ba5e81e53ce21cd260fe3368d6231dTom Stellard  MachineSDNode *AdjustRegClass(MachineSDNode *N, SelectionDAG &DAG) const;
4684a775d8e3d5a3765e01db4b454f849ed8be99beChristian Konig
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardpublic:
48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  SITargetLowering(TargetMachine &tm);
4973e44d8ae4c227af92b8f96f447e4a7ed38f6de5Tom Stellard  bool allowsUnalignedMemoryAccesses(EVT  VT, bool *IsFast) const;
50a41520cf9b9cefed2091a0624a34c5f7fdb42a68Tom Stellard  virtual bool shouldSplitVectorElementType(EVT VT) const;
5190c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig
5290c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig  SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
5390c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig                               bool isVarArg,
5490c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig                               const SmallVectorImpl<ISD::InputArg> &Ins,
55ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                               SDLoc DL, SelectionDAG &DAG,
5690c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig                               SmallVectorImpl<SDValue> &InVals) const;
5790c64cbaa124e0e8541680efeaa56f0e6eb78d9aChristian Konig
58f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr * MI,
59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                              MachineBasicBlock * BB) const;
60225ed7069caae9ece32d8bd3d15c6e41e21cc04bMatt Arsenault  virtual EVT getSetCCResultType(LLVMContext &Context, EVT VT) const;
61b87082228bb5151598addcf0eb3756cf0f906ab6Christian Konig  virtual MVT getScalarShiftAmountTy(EVT VT) const;
626e4dbcd1150ea6d4fbf87a7840b3d8481bfcc8c5Niels Ole Salscheider  virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const;
63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
64f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
65c018ecac2f2f475b6e1023e90d0e48fcf9bd6e1dChristian Konig  virtual SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const;
664d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig  virtual void AdjustInstrPostInstrSelection(MachineInstr *MI,
674d0e8a8a3e2e5b98f598acad4d57452b99d52e74Christian Konig                                             SDNode *Node) const;
68d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig
69d3b5509b8099b72104bd8a0d9a998a69eb56ab2aChristian Konig  int32_t analyzeImmediate(const SDNode *N) const;
70e5fcc0dee4b41658986047f346201ad98757e7d5Tom Stellard  SDValue CreateLiveInRegister(SelectionDAG &DAG, const TargetRegisterClass *RC,
71e5fcc0dee4b41658986047f346201ad98757e7d5Tom Stellard                               unsigned Reg, EVT VT) const;
72f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard};
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} // End namespace llvm
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#endif //SIISELLOWERING_H
77