Home | History | Annotate | Download | only in AVR
      1 //===-- AVRInstrInfo.cpp - AVR Instruction Information --------------------===//
      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 AVR implementation of the TargetInstrInfo class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "AVRInstrInfo.h"
     15 
     16 #include "llvm/ADT/STLExtras.h"
     17 #include "llvm/CodeGen/MachineConstantPool.h"
     18 #include "llvm/CodeGen/MachineFrameInfo.h"
     19 #include "llvm/CodeGen/MachineInstrBuilder.h"
     20 #include "llvm/CodeGen/MachineMemOperand.h"
     21 #include "llvm/IR/Constants.h"
     22 #include "llvm/IR/Function.h"
     23 #include "llvm/MC/MCContext.h"
     24 #include "llvm/Support/Debug.h"
     25 #include "llvm/Support/ErrorHandling.h"
     26 #include "llvm/Support/TargetRegistry.h"
     27 
     28 #include "AVR.h"
     29 #include "AVRMachineFunctionInfo.h"
     30 #include "AVRRegisterInfo.h"
     31 #include "AVRTargetMachine.h"
     32 #include "MCTargetDesc/AVRMCTargetDesc.h"
     33 
     34 #define GET_INSTRINFO_CTOR_DTOR
     35 #include "AVRGenInstrInfo.inc"
     36 
     37 namespace llvm {
     38 
     39 AVRInstrInfo::AVRInstrInfo()
     40     : AVRGenInstrInfo(AVR::ADJCALLSTACKDOWN, AVR::ADJCALLSTACKUP), RI() {}
     41 
     42 void AVRInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
     43                                MachineBasicBlock::iterator MI,
     44                                const DebugLoc &DL, unsigned DestReg,
     45                                unsigned SrcReg, bool KillSrc) const {
     46   const AVRSubtarget &STI = MBB.getParent()->getSubtarget<AVRSubtarget>();
     47   const AVRRegisterInfo &TRI = *STI.getRegisterInfo();
     48   unsigned Opc;
     49 
     50   // Not all AVR devices support the 16-bit `MOVW` instruction.
     51   if (AVR::DREGSRegClass.contains(DestReg, SrcReg)) {
     52     if (STI.hasMOVW()) {
     53       BuildMI(MBB, MI, DL, get(AVR::MOVWRdRr), DestReg)
     54           .addReg(SrcReg, getKillRegState(KillSrc));
     55     } else {
     56       unsigned DestLo, DestHi, SrcLo, SrcHi;
     57 
     58       TRI.splitReg(DestReg, DestLo, DestHi);
     59       TRI.splitReg(SrcReg,  SrcLo,  SrcHi);
     60 
     61       // Copy each individual register with the `MOV` instruction.
     62       BuildMI(MBB, MI, DL, get(AVR::MOVRdRr), DestLo)
     63         .addReg(SrcLo, getKillRegState(KillSrc));
     64       BuildMI(MBB, MI, DL, get(AVR::MOVRdRr), DestHi)
     65         .addReg(SrcHi, getKillRegState(KillSrc));
     66     }
     67   } else {
     68     if (AVR::GPR8RegClass.contains(DestReg, SrcReg)) {
     69       Opc = AVR::MOVRdRr;
     70     } else if (SrcReg == AVR::SP && AVR::DREGSRegClass.contains(DestReg)) {
     71       Opc = AVR::SPREAD;
     72     } else if (DestReg == AVR::SP && AVR::DREGSRegClass.contains(SrcReg)) {
     73       Opc = AVR::SPWRITE;
     74     } else {
     75       llvm_unreachable("Impossible reg-to-reg copy");
     76     }
     77 
     78     BuildMI(MBB, MI, DL, get(Opc), DestReg)
     79         .addReg(SrcReg, getKillRegState(KillSrc));
     80   }
     81 }
     82 
     83 unsigned AVRInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
     84                                            int &FrameIndex) const {
     85   switch (MI.getOpcode()) {
     86   case AVR::LDDRdPtrQ:
     87   case AVR::LDDWRdYQ: { //:FIXME: remove this once PR13375 gets fixed
     88     if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
     89         MI.getOperand(2).getImm() == 0) {
     90       FrameIndex = MI.getOperand(1).getIndex();
     91       return MI.getOperand(0).getReg();
     92     }
     93     break;
     94   }
     95   default:
     96     break;
     97   }
     98 
     99   return 0;
    100 }
    101 
    102 unsigned AVRInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
    103                                           int &FrameIndex) const {
    104   switch (MI.getOpcode()) {
    105   case AVR::STDPtrQRr:
    106   case AVR::STDWPtrQRr: {
    107     if (MI.getOperand(0).isFI() && MI.getOperand(1).isImm() &&
    108         MI.getOperand(1).getImm() == 0) {
    109       FrameIndex = MI.getOperand(0).getIndex();
    110       return MI.getOperand(2).getReg();
    111     }
    112     break;
    113   }
    114   default:
    115     break;
    116   }
    117 
    118   return 0;
    119 }
    120 
    121 void AVRInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
    122                                        MachineBasicBlock::iterator MI,
    123                                        unsigned SrcReg, bool isKill,
    124                                        int FrameIndex,
    125                                        const TargetRegisterClass *RC,
    126                                        const TargetRegisterInfo *TRI) const {
    127   MachineFunction &MF = *MBB.getParent();
    128   AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
    129 
    130   AFI->setHasSpills(true);
    131 
    132   DebugLoc DL;
    133   if (MI != MBB.end()) {
    134     DL = MI->getDebugLoc();
    135   }
    136 
    137   const MachineFrameInfo &MFI = MF.getFrameInfo();
    138 
    139   MachineMemOperand *MMO = MF.getMachineMemOperand(
    140       MachinePointerInfo::getFixedStack(MF, FrameIndex),
    141       MachineMemOperand::MOStore, MFI.getObjectSize(FrameIndex),
    142       MFI.getObjectAlignment(FrameIndex));
    143 
    144   unsigned Opcode = 0;
    145   if (TRI->isTypeLegalForClass(*RC, MVT::i8)) {
    146     Opcode = AVR::STDPtrQRr;
    147   } else if (TRI->isTypeLegalForClass(*RC, MVT::i16)) {
    148     Opcode = AVR::STDWPtrQRr;
    149   } else {
    150     llvm_unreachable("Cannot store this register into a stack slot!");
    151   }
    152 
    153   BuildMI(MBB, MI, DL, get(Opcode))
    154       .addFrameIndex(FrameIndex)
    155       .addImm(0)
    156       .addReg(SrcReg, getKillRegState(isKill))
    157       .addMemOperand(MMO);
    158 }
    159 
    160 void AVRInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
    161                                         MachineBasicBlock::iterator MI,
    162                                         unsigned DestReg, int FrameIndex,
    163                                         const TargetRegisterClass *RC,
    164                                         const TargetRegisterInfo *TRI) const {
    165   DebugLoc DL;
    166   if (MI != MBB.end()) {
    167     DL = MI->getDebugLoc();
    168   }
    169 
    170   MachineFunction &MF = *MBB.getParent();
    171   const MachineFrameInfo &MFI = MF.getFrameInfo();
    172 
    173   MachineMemOperand *MMO = MF.getMachineMemOperand(
    174       MachinePointerInfo::getFixedStack(MF, FrameIndex),
    175       MachineMemOperand::MOLoad, MFI.getObjectSize(FrameIndex),
    176       MFI.getObjectAlignment(FrameIndex));
    177 
    178   unsigned Opcode = 0;
    179   if (TRI->isTypeLegalForClass(*RC, MVT::i8)) {
    180     Opcode = AVR::LDDRdPtrQ;
    181   } else if (TRI->isTypeLegalForClass(*RC, MVT::i16)) {
    182     // Opcode = AVR::LDDWRdPtrQ;
    183     //:FIXME: remove this once PR13375 gets fixed
    184     Opcode = AVR::LDDWRdYQ;
    185   } else {
    186     llvm_unreachable("Cannot load this register from a stack slot!");
    187   }
    188 
    189   BuildMI(MBB, MI, DL, get(Opcode), DestReg)
    190       .addFrameIndex(FrameIndex)
    191       .addImm(0)
    192       .addMemOperand(MMO);
    193 }
    194 
    195 const MCInstrDesc &AVRInstrInfo::getBrCond(AVRCC::CondCodes CC) const {
    196   switch (CC) {
    197   default:
    198     llvm_unreachable("Unknown condition code!");
    199   case AVRCC::COND_EQ:
    200     return get(AVR::BREQk);
    201   case AVRCC::COND_NE:
    202     return get(AVR::BRNEk);
    203   case AVRCC::COND_GE:
    204     return get(AVR::BRGEk);
    205   case AVRCC::COND_LT:
    206     return get(AVR::BRLTk);
    207   case AVRCC::COND_SH:
    208     return get(AVR::BRSHk);
    209   case AVRCC::COND_LO:
    210     return get(AVR::BRLOk);
    211   case AVRCC::COND_MI:
    212     return get(AVR::BRMIk);
    213   case AVRCC::COND_PL:
    214     return get(AVR::BRPLk);
    215   }
    216 }
    217 
    218 AVRCC::CondCodes AVRInstrInfo::getCondFromBranchOpc(unsigned Opc) const {
    219   switch (Opc) {
    220   default:
    221     return AVRCC::COND_INVALID;
    222   case AVR::BREQk:
    223     return AVRCC::COND_EQ;
    224   case AVR::BRNEk:
    225     return AVRCC::COND_NE;
    226   case AVR::BRSHk:
    227     return AVRCC::COND_SH;
    228   case AVR::BRLOk:
    229     return AVRCC::COND_LO;
    230   case AVR::BRMIk:
    231     return AVRCC::COND_MI;
    232   case AVR::BRPLk:
    233     return AVRCC::COND_PL;
    234   case AVR::BRGEk:
    235     return AVRCC::COND_GE;
    236   case AVR::BRLTk:
    237     return AVRCC::COND_LT;
    238   }
    239 }
    240 
    241 AVRCC::CondCodes AVRInstrInfo::getOppositeCondition(AVRCC::CondCodes CC) const {
    242   switch (CC) {
    243   default:
    244     llvm_unreachable("Invalid condition!");
    245   case AVRCC::COND_EQ:
    246     return AVRCC::COND_NE;
    247   case AVRCC::COND_NE:
    248     return AVRCC::COND_EQ;
    249   case AVRCC::COND_SH:
    250     return AVRCC::COND_LO;
    251   case AVRCC::COND_LO:
    252     return AVRCC::COND_SH;
    253   case AVRCC::COND_GE:
    254     return AVRCC::COND_LT;
    255   case AVRCC::COND_LT:
    256     return AVRCC::COND_GE;
    257   case AVRCC::COND_MI:
    258     return AVRCC::COND_PL;
    259   case AVRCC::COND_PL:
    260     return AVRCC::COND_MI;
    261   }
    262 }
    263 
    264 bool AVRInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
    265                                  MachineBasicBlock *&TBB,
    266                                  MachineBasicBlock *&FBB,
    267                                  SmallVectorImpl<MachineOperand> &Cond,
    268                                  bool AllowModify) const {
    269   // Start from the bottom of the block and work up, examining the
    270   // terminator instructions.
    271   MachineBasicBlock::iterator I = MBB.end();
    272   MachineBasicBlock::iterator UnCondBrIter = MBB.end();
    273 
    274   while (I != MBB.begin()) {
    275     --I;
    276     if (I->isDebugInstr()) {
    277       continue;
    278     }
    279 
    280     // Working from the bottom, when we see a non-terminator
    281     // instruction, we're done.
    282     if (!isUnpredicatedTerminator(*I)) {
    283       break;
    284     }
    285 
    286     // A terminator that isn't a branch can't easily be handled
    287     // by this analysis.
    288     if (!I->getDesc().isBranch()) {
    289       return true;
    290     }
    291 
    292     // Handle unconditional branches.
    293     //:TODO: add here jmp
    294     if (I->getOpcode() == AVR::RJMPk) {
    295       UnCondBrIter = I;
    296 
    297       if (!AllowModify) {
    298         TBB = I->getOperand(0).getMBB();
    299         continue;
    300       }
    301 
    302       // If the block has any instructions after a JMP, delete them.
    303       while (std::next(I) != MBB.end()) {
    304         std::next(I)->eraseFromParent();
    305       }
    306 
    307       Cond.clear();
    308       FBB = 0;
    309 
    310       // Delete the JMP if it's equivalent to a fall-through.
    311       if (MBB.isLayoutSuccessor(I->getOperand(0).getMBB())) {
    312         TBB = 0;
    313         I->eraseFromParent();
    314         I = MBB.end();
    315         UnCondBrIter = MBB.end();
    316         continue;
    317       }
    318 
    319       // TBB is used to indicate the unconditinal destination.
    320       TBB = I->getOperand(0).getMBB();
    321       continue;
    322     }
    323 
    324     // Handle conditional branches.
    325     AVRCC::CondCodes BranchCode = getCondFromBranchOpc(I->getOpcode());
    326     if (BranchCode == AVRCC::COND_INVALID) {
    327       return true; // Can't handle indirect branch.
    328     }
    329 
    330     // Working from the bottom, handle the first conditional branch.
    331     if (Cond.empty()) {
    332       MachineBasicBlock *TargetBB = I->getOperand(0).getMBB();
    333       if (AllowModify && UnCondBrIter != MBB.end() &&
    334           MBB.isLayoutSuccessor(TargetBB)) {
    335         // If we can modify the code and it ends in something like:
    336         //
    337         //     jCC L1
    338         //     jmp L2
    339         //   L1:
    340         //     ...
    341         //   L2:
    342         //
    343         // Then we can change this to:
    344         //
    345         //     jnCC L2
    346         //   L1:
    347         //     ...
    348         //   L2:
    349         //
    350         // Which is a bit more efficient.
    351         // We conditionally jump to the fall-through block.
    352         BranchCode = getOppositeCondition(BranchCode);
    353         unsigned JNCC = getBrCond(BranchCode).getOpcode();
    354         MachineBasicBlock::iterator OldInst = I;
    355 
    356         BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(JNCC))
    357             .addMBB(UnCondBrIter->getOperand(0).getMBB());
    358         BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(AVR::RJMPk))
    359             .addMBB(TargetBB);
    360 
    361         OldInst->eraseFromParent();
    362         UnCondBrIter->eraseFromParent();
    363 
    364         // Restart the analysis.
    365         UnCondBrIter = MBB.end();
    366         I = MBB.end();
    367         continue;
    368       }
    369 
    370       FBB = TBB;
    371       TBB = I->getOperand(0).getMBB();
    372       Cond.push_back(MachineOperand::CreateImm(BranchCode));
    373       continue;
    374     }
    375 
    376     // Handle subsequent conditional branches. Only handle the case where all
    377     // conditional branches branch to the same destination.
    378     assert(Cond.size() == 1);
    379     assert(TBB);
    380 
    381     // Only handle the case where all conditional branches branch to
    382     // the same destination.
    383     if (TBB != I->getOperand(0).getMBB()) {
    384       return true;
    385     }
    386 
    387     AVRCC::CondCodes OldBranchCode = (AVRCC::CondCodes)Cond[0].getImm();
    388     // If the conditions are the same, we can leave them alone.
    389     if (OldBranchCode == BranchCode) {
    390       continue;
    391     }
    392 
    393     return true;
    394   }
    395 
    396   return false;
    397 }
    398 
    399 unsigned AVRInstrInfo::insertBranch(MachineBasicBlock &MBB,
    400                                     MachineBasicBlock *TBB,
    401                                     MachineBasicBlock *FBB,
    402                                     ArrayRef<MachineOperand> Cond,
    403                                     const DebugLoc &DL,
    404                                     int *BytesAdded) const {
    405   if (BytesAdded) *BytesAdded = 0;
    406 
    407   // Shouldn't be a fall through.
    408   assert(TBB && "insertBranch must not be told to insert a fallthrough");
    409   assert((Cond.size() == 1 || Cond.size() == 0) &&
    410          "AVR branch conditions have one component!");
    411 
    412   if (Cond.empty()) {
    413     assert(!FBB && "Unconditional branch with multiple successors!");
    414     auto &MI = *BuildMI(&MBB, DL, get(AVR::RJMPk)).addMBB(TBB);
    415     if (BytesAdded)
    416       *BytesAdded += getInstSizeInBytes(MI);
    417     return 1;
    418   }
    419 
    420   // Conditional branch.
    421   unsigned Count = 0;
    422   AVRCC::CondCodes CC = (AVRCC::CondCodes)Cond[0].getImm();
    423   auto &CondMI = *BuildMI(&MBB, DL, getBrCond(CC)).addMBB(TBB);
    424 
    425   if (BytesAdded) *BytesAdded += getInstSizeInBytes(CondMI);
    426   ++Count;
    427 
    428   if (FBB) {
    429     // Two-way Conditional branch. Insert the second branch.
    430     auto &MI = *BuildMI(&MBB, DL, get(AVR::RJMPk)).addMBB(FBB);
    431     if (BytesAdded) *BytesAdded += getInstSizeInBytes(MI);
    432     ++Count;
    433   }
    434 
    435   return Count;
    436 }
    437 
    438 unsigned AVRInstrInfo::removeBranch(MachineBasicBlock &MBB,
    439                                     int *BytesRemoved) const {
    440   if (BytesRemoved) *BytesRemoved = 0;
    441 
    442   MachineBasicBlock::iterator I = MBB.end();
    443   unsigned Count = 0;
    444 
    445   while (I != MBB.begin()) {
    446     --I;
    447     if (I->isDebugInstr()) {
    448       continue;
    449     }
    450     //:TODO: add here the missing jmp instructions once they are implemented
    451     // like jmp, {e}ijmp, and other cond branches, ...
    452     if (I->getOpcode() != AVR::RJMPk &&
    453         getCondFromBranchOpc(I->getOpcode()) == AVRCC::COND_INVALID) {
    454       break;
    455     }
    456 
    457     // Remove the branch.
    458     if (BytesRemoved) *BytesRemoved += getInstSizeInBytes(*I);
    459     I->eraseFromParent();
    460     I = MBB.end();
    461     ++Count;
    462   }
    463 
    464   return Count;
    465 }
    466 
    467 bool AVRInstrInfo::reverseBranchCondition(
    468     SmallVectorImpl<MachineOperand> &Cond) const {
    469   assert(Cond.size() == 1 && "Invalid AVR branch condition!");
    470 
    471   AVRCC::CondCodes CC = static_cast<AVRCC::CondCodes>(Cond[0].getImm());
    472   Cond[0].setImm(getOppositeCondition(CC));
    473 
    474   return false;
    475 }
    476 
    477 unsigned AVRInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
    478   unsigned Opcode = MI.getOpcode();
    479 
    480   switch (Opcode) {
    481   // A regular instruction
    482   default: {
    483     const MCInstrDesc &Desc = get(Opcode);
    484     return Desc.getSize();
    485   }
    486   case TargetOpcode::EH_LABEL:
    487   case TargetOpcode::IMPLICIT_DEF:
    488   case TargetOpcode::KILL:
    489   case TargetOpcode::DBG_VALUE:
    490     return 0;
    491   case TargetOpcode::INLINEASM: {
    492     const MachineFunction &MF = *MI.getParent()->getParent();
    493     const AVRTargetMachine &TM = static_cast<const AVRTargetMachine&>(MF.getTarget());
    494     const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
    495     const TargetInstrInfo &TII = *STI.getInstrInfo();
    496 
    497     return TII.getInlineAsmLength(MI.getOperand(0).getSymbolName(),
    498                                   *TM.getMCAsmInfo());
    499   }
    500   }
    501 }
    502 
    503 MachineBasicBlock *
    504 AVRInstrInfo::getBranchDestBlock(const MachineInstr &MI) const {
    505   switch (MI.getOpcode()) {
    506   default:
    507     llvm_unreachable("unexpected opcode!");
    508   case AVR::JMPk:
    509   case AVR::CALLk:
    510   case AVR::RCALLk:
    511   case AVR::RJMPk:
    512   case AVR::BREQk:
    513   case AVR::BRNEk:
    514   case AVR::BRSHk:
    515   case AVR::BRLOk:
    516   case AVR::BRMIk:
    517   case AVR::BRPLk:
    518   case AVR::BRGEk:
    519   case AVR::BRLTk:
    520     return MI.getOperand(0).getMBB();
    521   case AVR::BRBSsk:
    522   case AVR::BRBCsk:
    523     return MI.getOperand(1).getMBB();
    524   case AVR::SBRCRrB:
    525   case AVR::SBRSRrB:
    526   case AVR::SBICAb:
    527   case AVR::SBISAb:
    528     llvm_unreachable("unimplemented branch instructions");
    529   }
    530 }
    531 
    532 bool AVRInstrInfo::isBranchOffsetInRange(unsigned BranchOp,
    533                                          int64_t BrOffset) const {
    534 
    535   switch (BranchOp) {
    536   default:
    537     llvm_unreachable("unexpected opcode!");
    538   case AVR::JMPk:
    539   case AVR::CALLk:
    540     return true;
    541   case AVR::RCALLk:
    542   case AVR::RJMPk:
    543     return isIntN(13, BrOffset);
    544   case AVR::BRBSsk:
    545   case AVR::BRBCsk:
    546   case AVR::BREQk:
    547   case AVR::BRNEk:
    548   case AVR::BRSHk:
    549   case AVR::BRLOk:
    550   case AVR::BRMIk:
    551   case AVR::BRPLk:
    552   case AVR::BRGEk:
    553   case AVR::BRLTk:
    554     return isIntN(7, BrOffset);
    555   }
    556 }
    557 
    558 unsigned AVRInstrInfo::insertIndirectBranch(MachineBasicBlock &MBB,
    559                                             MachineBasicBlock &NewDestBB,
    560                                             const DebugLoc &DL,
    561                                             int64_t BrOffset,
    562                                             RegScavenger *RS) const {
    563     // This method inserts a *direct* branch (JMP), despite its name.
    564     // LLVM calls this method to fixup unconditional branches; it never calls
    565     // insertBranch or some hypothetical "insertDirectBranch".
    566     // See lib/CodeGen/RegisterRelaxation.cpp for details.
    567     // We end up here when a jump is too long for a RJMP instruction.
    568     auto &MI = *BuildMI(&MBB, DL, get(AVR::JMPk)).addMBB(&NewDestBB);
    569 
    570     return getInstSizeInBytes(MI);
    571 }
    572 
    573 } // end of namespace llvm
    574 
    575