llvm.org GIT mirror llvm / 3a96e61 lib / Target / R600 / SIISelLowering.h
3a96e61

Tree @3a96e61 (Download .tar.gz)

SIISelLowering.h @3a96e61

f98f2ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f95b162
e5fcc0d
68db37b
 
a2b4eb6
83918a2
f98f2ce
e86f9d7
a2b4eb6
8cd70d3
6b7d99d
f98f2ce
68db37b
d3b5509
 
3406d88
 
9bf4590
 
225ed70
d3b5509
 
84a775d
 
17e8ad6
84a775d
f98f2ce
 
bb7bf85
a41520c
90c64cb
 
 
 
ac6d9be
90c64cb
 
f98f2ce
 
225ed70
b870822
6e4dbcd
f98f2ce
 
c018eca
4d0e8a8
 
d3b5509
 
e5fcc0d
 
f98f2ce
 
 
 
 
//===-- SIISelLowering.h - SI DAG Lowering Interface ------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
/// \file
/// \brief SI DAG Lowering interface definition
//
//===----------------------------------------------------------------------===//

#ifndef SIISELLOWERING_H
#define SIISELLOWERING_H

#include "AMDGPUISelLowering.h"
#include "SIInstrInfo.h"

namespace llvm {

class SITargetLowering : public AMDGPUTargetLowering {
  SDValue LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT, SDLoc DL,
                         SDValue Chain, unsigned Offset) const;
  SDValue LowerSampleIntrinsic(unsigned Opcode, const SDValue &Op,
                               SelectionDAG &DAG) const;
  SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
  SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
  SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
  SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
  SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
  SDValue LowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const;
  SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;

  SDValue ResourceDescriptorToi128(SDValue Op, SelectionDAG &DAG) const;
  bool foldImm(SDValue &Operand, int32_t &Immediate,
               bool &ScalarSlotUsed) const;
  const TargetRegisterClass *getRegClassForNode(SelectionDAG &DAG,
                                                const SDValue &Op) const;
  bool fitsRegClass(SelectionDAG &DAG, const SDValue &Op,
                    unsigned RegClass) const;
  void ensureSRegLimit(SelectionDAG &DAG, SDValue &Operand,
                       unsigned RegClass, bool &ScalarSlotUsed) const;

  SDNode *foldOperands(MachineSDNode *N, SelectionDAG &DAG) const;
  void adjustWritemask(MachineSDNode *&N, SelectionDAG &DAG) const;
  MachineSDNode *AdjustRegClass(MachineSDNode *N, SelectionDAG &DAG) const;

public:
  SITargetLowering(TargetMachine &tm);
  bool allowsUnalignedMemoryAccesses(EVT VT, unsigned AS, bool *IsFast) const;
  virtual bool shouldSplitVectorElementType(EVT VT) const;

  SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
                               bool isVarArg,
                               const SmallVectorImpl<ISD::InputArg> &Ins,
                               SDLoc DL, SelectionDAG &DAG,
                               SmallVectorImpl<SDValue> &InVals) const;

  virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr * MI,
                                              MachineBasicBlock * BB) const;
  virtual EVT getSetCCResultType(LLVMContext &Context, EVT VT) const;
  virtual MVT getScalarShiftAmountTy(EVT VT) const;
  virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const;
  virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
  virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
  virtual SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const;
  virtual void AdjustInstrPostInstrSelection(MachineInstr *MI,
                                             SDNode *Node) const;

  int32_t analyzeImmediate(const SDNode *N) const;
  SDValue CreateLiveInRegister(SelectionDAG &DAG, const TargetRegisterClass *RC,
                               unsigned Reg, EVT VT) const;
};

} // End namespace llvm

#endif //SIISELLOWERING_H