Home | History | Annotate | Download | only in radeon
      1 //===-- AMDGPUInstrInfo.cpp - Base class for AMD GPU InstrInfo ------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the implementation of the TargetInstrInfo class that is
     11 // common to all AMD GPUs.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "AMDGPUInstrInfo.h"
     16 #include "AMDGPURegisterInfo.h"
     17 #include "AMDGPUTargetMachine.h"
     18 #include "AMDIL.h"
     19 #include "AMDILUtilityFunctions.h"
     20 #include "llvm/CodeGen/MachineFrameInfo.h"
     21 #include "llvm/CodeGen/MachineInstrBuilder.h"
     22 #include "llvm/CodeGen/MachineRegisterInfo.h"
     23 
     24 #define GET_INSTRINFO_CTOR
     25 #include "AMDGPUGenInstrInfo.inc"
     26 
     27 using namespace llvm;
     28 
     29 AMDGPUInstrInfo::AMDGPUInstrInfo(TargetMachine &tm)
     30   : AMDGPUGenInstrInfo(0,0), RI(tm, *this), TM(tm) { }
     31 
     32 const AMDGPURegisterInfo &AMDGPUInstrInfo::getRegisterInfo() const {
     33   return RI;
     34 }
     35 
     36 bool AMDGPUInstrInfo::isCoalescableExtInstr(const MachineInstr &MI,
     37                                            unsigned &SrcReg, unsigned &DstReg,
     38                                            unsigned &SubIdx) const {
     39 // TODO: Implement this function
     40   return false;
     41 }
     42 
     43 unsigned AMDGPUInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
     44                                              int &FrameIndex) const {
     45 // TODO: Implement this function
     46   return 0;
     47 }
     48 
     49 unsigned AMDGPUInstrInfo::isLoadFromStackSlotPostFE(const MachineInstr *MI,
     50                                                    int &FrameIndex) const {
     51 // TODO: Implement this function
     52   return 0;
     53 }
     54 
     55 bool AMDGPUInstrInfo::hasLoadFromStackSlot(const MachineInstr *MI,
     56                                           const MachineMemOperand *&MMO,
     57                                           int &FrameIndex) const {
     58 // TODO: Implement this function
     59   return false;
     60 }
     61 unsigned AMDGPUInstrInfo::isStoreFromStackSlot(const MachineInstr *MI,
     62                                               int &FrameIndex) const {
     63 // TODO: Implement this function
     64   return 0;
     65 }
     66 unsigned AMDGPUInstrInfo::isStoreFromStackSlotPostFE(const MachineInstr *MI,
     67                                                     int &FrameIndex) const {
     68 // TODO: Implement this function
     69   return 0;
     70 }
     71 bool AMDGPUInstrInfo::hasStoreFromStackSlot(const MachineInstr *MI,
     72                                            const MachineMemOperand *&MMO,
     73                                            int &FrameIndex) const {
     74 // TODO: Implement this function
     75   return false;
     76 }
     77 
     78 MachineInstr *
     79 AMDGPUInstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     80                                       MachineBasicBlock::iterator &MBBI,
     81                                       LiveVariables *LV) const {
     82 // TODO: Implement this function
     83   return NULL;
     84 }
     85 bool AMDGPUInstrInfo::getNextBranchInstr(MachineBasicBlock::iterator &iter,
     86                                         MachineBasicBlock &MBB) const {
     87   while (iter != MBB.end()) {
     88     switch (iter->getOpcode()) {
     89     default:
     90       break;
     91       ExpandCaseToAllScalarTypes(AMDGPU::BRANCH_COND);
     92     case AMDGPU::BRANCH:
     93       return true;
     94     };
     95     ++iter;
     96   }
     97   return false;
     98 }
     99 
    100 MachineBasicBlock::iterator skipFlowControl(MachineBasicBlock *MBB) {
    101   MachineBasicBlock::iterator tmp = MBB->end();
    102   if (!MBB->size()) {
    103     return MBB->end();
    104   }
    105   while (--tmp) {
    106     if (tmp->getOpcode() == AMDGPU::ENDLOOP
    107         || tmp->getOpcode() == AMDGPU::ENDIF
    108         || tmp->getOpcode() == AMDGPU::ELSE) {
    109       if (tmp == MBB->begin()) {
    110         return tmp;
    111       } else {
    112         continue;
    113       }
    114     }  else {
    115       return ++tmp;
    116     }
    117   }
    118   return MBB->end();
    119 }
    120 
    121 void
    122 AMDGPUInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
    123                                     MachineBasicBlock::iterator MI,
    124                                     unsigned SrcReg, bool isKill,
    125                                     int FrameIndex,
    126                                     const TargetRegisterClass *RC,
    127                                     const TargetRegisterInfo *TRI) const {
    128   assert(!"Not Implemented");
    129 }
    130 
    131 void
    132 AMDGPUInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
    133                                      MachineBasicBlock::iterator MI,
    134                                      unsigned DestReg, int FrameIndex,
    135                                      const TargetRegisterClass *RC,
    136                                      const TargetRegisterInfo *TRI) const {
    137   assert(!"Not Implemented");
    138 }
    139 
    140 MachineInstr *
    141 AMDGPUInstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
    142                                       MachineInstr *MI,
    143                                       const SmallVectorImpl<unsigned> &Ops,
    144                                       int FrameIndex) const {
    145 // TODO: Implement this function
    146   return 0;
    147 }
    148 MachineInstr*
    149 AMDGPUInstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
    150                                       MachineInstr *MI,
    151                                       const SmallVectorImpl<unsigned> &Ops,
    152                                       MachineInstr *LoadMI) const {
    153   // TODO: Implement this function
    154   return 0;
    155 }
    156 bool
    157 AMDGPUInstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
    158                                      const SmallVectorImpl<unsigned> &Ops) const
    159 {
    160   // TODO: Implement this function
    161   return false;
    162 }
    163 bool
    164 AMDGPUInstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
    165                                  unsigned Reg, bool UnfoldLoad,
    166                                  bool UnfoldStore,
    167                                  SmallVectorImpl<MachineInstr*> &NewMIs) const {
    168   // TODO: Implement this function
    169   return false;
    170 }
    171 
    172 bool
    173 AMDGPUInstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
    174                                     SmallVectorImpl<SDNode*> &NewNodes) const {
    175   // TODO: Implement this function
    176   return false;
    177 }
    178 
    179 unsigned
    180 AMDGPUInstrInfo::getOpcodeAfterMemoryUnfold(unsigned Opc,
    181                                            bool UnfoldLoad, bool UnfoldStore,
    182                                            unsigned *LoadRegIndex) const {
    183   // TODO: Implement this function
    184   return 0;
    185 }
    186 
    187 bool AMDGPUInstrInfo::shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,
    188                                              int64_t Offset1, int64_t Offset2,
    189                                              unsigned NumLoads) const {
    190   assert(Offset2 > Offset1
    191          && "Second offset should be larger than first offset!");
    192   // If we have less than 16 loads in a row, and the offsets are within 16,
    193   // then schedule together.
    194   // TODO: Make the loads schedule near if it fits in a cacheline
    195   return (NumLoads < 16 && (Offset2 - Offset1) < 16);
    196 }
    197 
    198 bool
    199 AMDGPUInstrInfo::ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond)
    200   const {
    201   // TODO: Implement this function
    202   return true;
    203 }
    204 void AMDGPUInstrInfo::insertNoop(MachineBasicBlock &MBB,
    205                                 MachineBasicBlock::iterator MI) const {
    206   // TODO: Implement this function
    207 }
    208 
    209 bool AMDGPUInstrInfo::isPredicated(const MachineInstr *MI) const {
    210   // TODO: Implement this function
    211   return false;
    212 }
    213 bool
    214 AMDGPUInstrInfo::SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1,
    215                                   const SmallVectorImpl<MachineOperand> &Pred2)
    216   const {
    217   // TODO: Implement this function
    218   return false;
    219 }
    220 
    221 bool AMDGPUInstrInfo::DefinesPredicate(MachineInstr *MI,
    222                                       std::vector<MachineOperand> &Pred) const {
    223   // TODO: Implement this function
    224   return false;
    225 }
    226 
    227 bool AMDGPUInstrInfo::isPredicable(MachineInstr *MI) const {
    228   // TODO: Implement this function
    229   return MI->getDesc().isPredicable();
    230 }
    231 
    232 bool
    233 AMDGPUInstrInfo::isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const {
    234   // TODO: Implement this function
    235   return true;
    236 }
    237 
    238 void AMDGPUInstrInfo::convertToISA(MachineInstr & MI, MachineFunction &MF,
    239     DebugLoc DL) const
    240 {
    241   MachineRegisterInfo &MRI = MF.getRegInfo();
    242   const AMDGPURegisterInfo & RI = getRegisterInfo();
    243 
    244   for (unsigned i = 0; i < MI.getNumOperands(); i++) {
    245     MachineOperand &MO = MI.getOperand(i);
    246     // Convert dst regclass to one that is supported by the ISA
    247     if (MO.isReg() && MO.isDef()) {
    248       if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) {
    249         const TargetRegisterClass * oldRegClass = MRI.getRegClass(MO.getReg());
    250         const TargetRegisterClass * newRegClass = RI.getISARegClass(oldRegClass);
    251 
    252         assert(newRegClass);
    253 
    254         MRI.setRegClass(MO.getReg(), newRegClass);
    255       }
    256     }
    257   }
    258 }
    259