Home | History | Annotate | Download | only in AVR
      1 //===-- AVRExpandPseudoInsts.cpp - Expand pseudo instructions -------------===//
      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 a pass that expands pseudo instructions into target
     11 // instructions. This pass should be run after register allocation but before
     12 // the post-regalloc scheduling pass.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #include "AVR.h"
     17 #include "AVRInstrInfo.h"
     18 #include "AVRTargetMachine.h"
     19 #include "MCTargetDesc/AVRMCTargetDesc.h"
     20 
     21 #include "llvm/CodeGen/MachineFunctionPass.h"
     22 #include "llvm/CodeGen/MachineInstrBuilder.h"
     23 #include "llvm/CodeGen/MachineRegisterInfo.h"
     24 #include "llvm/CodeGen/RegisterScavenging.h"
     25 #include "llvm/CodeGen/TargetRegisterInfo.h"
     26 
     27 using namespace llvm;
     28 
     29 #define AVR_EXPAND_PSEUDO_NAME "AVR pseudo instruction expansion pass"
     30 
     31 namespace {
     32 
     33 /// Expands "placeholder" instructions marked as pseudo into
     34 /// actual AVR instructions.
     35 class AVRExpandPseudo : public MachineFunctionPass {
     36 public:
     37   static char ID;
     38 
     39   AVRExpandPseudo() : MachineFunctionPass(ID) {
     40     initializeAVRExpandPseudoPass(*PassRegistry::getPassRegistry());
     41   }
     42 
     43   bool runOnMachineFunction(MachineFunction &MF) override;
     44 
     45   StringRef getPassName() const override { return AVR_EXPAND_PSEUDO_NAME; }
     46 
     47 private:
     48   typedef MachineBasicBlock Block;
     49   typedef Block::iterator BlockIt;
     50 
     51   const AVRRegisterInfo *TRI;
     52   const TargetInstrInfo *TII;
     53 
     54   /// The register to be used for temporary storage.
     55   const unsigned SCRATCH_REGISTER = AVR::R0;
     56   /// The IO address of the status register.
     57   const unsigned SREG_ADDR = 0x3f;
     58 
     59   bool expandMBB(Block &MBB);
     60   bool expandMI(Block &MBB, BlockIt MBBI);
     61   template <unsigned OP> bool expand(Block &MBB, BlockIt MBBI);
     62 
     63   MachineInstrBuilder buildMI(Block &MBB, BlockIt MBBI, unsigned Opcode) {
     64     return BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(Opcode));
     65   }
     66 
     67   MachineInstrBuilder buildMI(Block &MBB, BlockIt MBBI, unsigned Opcode,
     68                               unsigned DstReg) {
     69     return BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(Opcode), DstReg);
     70   }
     71 
     72   MachineRegisterInfo &getRegInfo(Block &MBB) { return MBB.getParent()->getRegInfo(); }
     73 
     74   bool expandArith(unsigned OpLo, unsigned OpHi, Block &MBB, BlockIt MBBI);
     75   bool expandLogic(unsigned Op, Block &MBB, BlockIt MBBI);
     76   bool expandLogicImm(unsigned Op, Block &MBB, BlockIt MBBI);
     77   bool isLogicImmOpRedundant(unsigned Op, unsigned ImmVal) const;
     78 
     79   template<typename Func>
     80   bool expandAtomic(Block &MBB, BlockIt MBBI, Func f);
     81 
     82   template<typename Func>
     83   bool expandAtomicBinaryOp(unsigned Opcode, Block &MBB, BlockIt MBBI, Func f);
     84 
     85   bool expandAtomicBinaryOp(unsigned Opcode, Block &MBB, BlockIt MBBI);
     86 
     87   bool expandAtomicArithmeticOp(unsigned MemOpcode,
     88                                 unsigned ArithOpcode,
     89                                 Block &MBB,
     90                                 BlockIt MBBI);
     91 
     92   /// Scavenges a free GPR8 register for use.
     93   unsigned scavengeGPR8(MachineInstr &MI);
     94 };
     95 
     96 char AVRExpandPseudo::ID = 0;
     97 
     98 bool AVRExpandPseudo::expandMBB(MachineBasicBlock &MBB) {
     99   bool Modified = false;
    100 
    101   BlockIt MBBI = MBB.begin(), E = MBB.end();
    102   while (MBBI != E) {
    103     BlockIt NMBBI = std::next(MBBI);
    104     Modified |= expandMI(MBB, MBBI);
    105     MBBI = NMBBI;
    106   }
    107 
    108   return Modified;
    109 }
    110 
    111 bool AVRExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
    112   bool Modified = false;
    113 
    114   const AVRSubtarget &STI = MF.getSubtarget<AVRSubtarget>();
    115   TRI = STI.getRegisterInfo();
    116   TII = STI.getInstrInfo();
    117 
    118   // We need to track liveness in order to use register scavenging.
    119   MF.getProperties().set(MachineFunctionProperties::Property::TracksLiveness);
    120 
    121   for (Block &MBB : MF) {
    122     bool ContinueExpanding = true;
    123     unsigned ExpandCount = 0;
    124 
    125     // Continue expanding the block until all pseudos are expanded.
    126     do {
    127       assert(ExpandCount < 10 && "pseudo expand limit reached");
    128 
    129       bool BlockModified = expandMBB(MBB);
    130       Modified |= BlockModified;
    131       ExpandCount++;
    132 
    133       ContinueExpanding = BlockModified;
    134     } while (ContinueExpanding);
    135   }
    136 
    137   return Modified;
    138 }
    139 
    140 bool AVRExpandPseudo::
    141 expandArith(unsigned OpLo, unsigned OpHi, Block &MBB, BlockIt MBBI) {
    142   MachineInstr &MI = *MBBI;
    143   unsigned SrcLoReg, SrcHiReg, DstLoReg, DstHiReg;
    144   unsigned DstReg = MI.getOperand(0).getReg();
    145   unsigned SrcReg = MI.getOperand(2).getReg();
    146   bool DstIsDead = MI.getOperand(0).isDead();
    147   bool DstIsKill = MI.getOperand(1).isKill();
    148   bool SrcIsKill = MI.getOperand(2).isKill();
    149   bool ImpIsDead = MI.getOperand(3).isDead();
    150   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
    151   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    152 
    153   buildMI(MBB, MBBI, OpLo)
    154     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    155     .addReg(DstLoReg, getKillRegState(DstIsKill))
    156     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
    157 
    158   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    159     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    160     .addReg(DstHiReg, getKillRegState(DstIsKill))
    161     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
    162 
    163   if (ImpIsDead)
    164     MIBHI->getOperand(3).setIsDead();
    165 
    166   // SREG is always implicitly killed
    167   MIBHI->getOperand(4).setIsKill();
    168 
    169   MI.eraseFromParent();
    170   return true;
    171 }
    172 
    173 bool AVRExpandPseudo::
    174 expandLogic(unsigned Op, Block &MBB, BlockIt MBBI) {
    175   MachineInstr &MI = *MBBI;
    176   unsigned SrcLoReg, SrcHiReg, DstLoReg, DstHiReg;
    177   unsigned DstReg = MI.getOperand(0).getReg();
    178   unsigned SrcReg = MI.getOperand(2).getReg();
    179   bool DstIsDead = MI.getOperand(0).isDead();
    180   bool DstIsKill = MI.getOperand(1).isKill();
    181   bool SrcIsKill = MI.getOperand(2).isKill();
    182   bool ImpIsDead = MI.getOperand(3).isDead();
    183   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
    184   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    185 
    186   auto MIBLO = buildMI(MBB, MBBI, Op)
    187     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    188     .addReg(DstLoReg, getKillRegState(DstIsKill))
    189     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
    190 
    191   // SREG is always implicitly dead
    192   MIBLO->getOperand(3).setIsDead();
    193 
    194   auto MIBHI = buildMI(MBB, MBBI, Op)
    195     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    196     .addReg(DstHiReg, getKillRegState(DstIsKill))
    197     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
    198 
    199   if (ImpIsDead)
    200     MIBHI->getOperand(3).setIsDead();
    201 
    202   MI.eraseFromParent();
    203   return true;
    204 }
    205 
    206 bool AVRExpandPseudo::
    207   isLogicImmOpRedundant(unsigned Op, unsigned ImmVal) const {
    208 
    209   // ANDI Rd, 0xff is redundant.
    210   if (Op == AVR::ANDIRdK && ImmVal == 0xff)
    211     return true;
    212 
    213   // ORI Rd, 0x0 is redundant.
    214   if (Op == AVR::ORIRdK && ImmVal == 0x0)
    215     return true;
    216 
    217   return false;
    218 }
    219 
    220 bool AVRExpandPseudo::
    221 expandLogicImm(unsigned Op, Block &MBB, BlockIt MBBI) {
    222   MachineInstr &MI = *MBBI;
    223   unsigned DstLoReg, DstHiReg;
    224   unsigned DstReg = MI.getOperand(0).getReg();
    225   bool DstIsDead = MI.getOperand(0).isDead();
    226   bool SrcIsKill = MI.getOperand(1).isKill();
    227   bool ImpIsDead = MI.getOperand(3).isDead();
    228   unsigned Imm = MI.getOperand(2).getImm();
    229   unsigned Lo8 = Imm & 0xff;
    230   unsigned Hi8 = (Imm >> 8) & 0xff;
    231   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    232 
    233   if (!isLogicImmOpRedundant(Op, Lo8)) {
    234     auto MIBLO = buildMI(MBB, MBBI, Op)
    235       .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    236       .addReg(DstLoReg, getKillRegState(SrcIsKill))
    237       .addImm(Lo8);
    238 
    239     // SREG is always implicitly dead
    240     MIBLO->getOperand(3).setIsDead();
    241   }
    242 
    243   if (!isLogicImmOpRedundant(Op, Hi8)) {
    244     auto MIBHI = buildMI(MBB, MBBI, Op)
    245       .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    246       .addReg(DstHiReg, getKillRegState(SrcIsKill))
    247       .addImm(Hi8);
    248 
    249     if (ImpIsDead)
    250       MIBHI->getOperand(3).setIsDead();
    251   }
    252 
    253   MI.eraseFromParent();
    254   return true;
    255 }
    256 
    257 template <>
    258 bool AVRExpandPseudo::expand<AVR::ADDWRdRr>(Block &MBB, BlockIt MBBI) {
    259   return expandArith(AVR::ADDRdRr, AVR::ADCRdRr, MBB, MBBI);
    260 }
    261 
    262 template <>
    263 bool AVRExpandPseudo::expand<AVR::ADCWRdRr>(Block &MBB, BlockIt MBBI) {
    264   return expandArith(AVR::ADCRdRr, AVR::ADCRdRr, MBB, MBBI);
    265 }
    266 
    267 template <>
    268 bool AVRExpandPseudo::expand<AVR::SUBWRdRr>(Block &MBB, BlockIt MBBI) {
    269   return expandArith(AVR::SUBRdRr, AVR::SBCRdRr, MBB, MBBI);
    270 }
    271 
    272 template <>
    273 bool AVRExpandPseudo::expand<AVR::SUBIWRdK>(Block &MBB, BlockIt MBBI) {
    274   MachineInstr &MI = *MBBI;
    275   unsigned DstLoReg, DstHiReg;
    276   unsigned DstReg = MI.getOperand(0).getReg();
    277   bool DstIsDead = MI.getOperand(0).isDead();
    278   bool SrcIsKill = MI.getOperand(1).isKill();
    279   bool ImpIsDead = MI.getOperand(3).isDead();
    280   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    281 
    282   auto MIBLO = buildMI(MBB, MBBI, AVR::SUBIRdK)
    283     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    284     .addReg(DstLoReg, getKillRegState(SrcIsKill));
    285 
    286   auto MIBHI = buildMI(MBB, MBBI, AVR::SBCIRdK)
    287     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    288     .addReg(DstHiReg, getKillRegState(SrcIsKill));
    289 
    290   switch (MI.getOperand(2).getType()) {
    291   case MachineOperand::MO_GlobalAddress: {
    292     const GlobalValue *GV = MI.getOperand(2).getGlobal();
    293     int64_t Offs = MI.getOperand(2).getOffset();
    294     unsigned TF = MI.getOperand(2).getTargetFlags();
    295     MIBLO.addGlobalAddress(GV, Offs, TF | AVRII::MO_NEG | AVRII::MO_LO);
    296     MIBHI.addGlobalAddress(GV, Offs, TF | AVRII::MO_NEG | AVRII::MO_HI);
    297     break;
    298   }
    299   case MachineOperand::MO_Immediate: {
    300     unsigned Imm = MI.getOperand(2).getImm();
    301     MIBLO.addImm(Imm & 0xff);
    302     MIBHI.addImm((Imm >> 8) & 0xff);
    303     break;
    304   }
    305   default:
    306     llvm_unreachable("Unknown operand type!");
    307   }
    308 
    309   if (ImpIsDead)
    310     MIBHI->getOperand(3).setIsDead();
    311 
    312   // SREG is always implicitly killed
    313   MIBHI->getOperand(4).setIsKill();
    314 
    315   MI.eraseFromParent();
    316   return true;
    317 }
    318 
    319 template <>
    320 bool AVRExpandPseudo::expand<AVR::SBCWRdRr>(Block &MBB, BlockIt MBBI) {
    321   return expandArith(AVR::SBCRdRr, AVR::SBCRdRr, MBB, MBBI);
    322 }
    323 
    324 template <>
    325 bool AVRExpandPseudo::expand<AVR::SBCIWRdK>(Block &MBB, BlockIt MBBI) {
    326   MachineInstr &MI = *MBBI;
    327   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    328   unsigned DstReg = MI.getOperand(0).getReg();
    329   bool DstIsDead = MI.getOperand(0).isDead();
    330   bool SrcIsKill = MI.getOperand(1).isKill();
    331   bool ImpIsDead = MI.getOperand(3).isDead();
    332   unsigned Imm = MI.getOperand(2).getImm();
    333   unsigned Lo8 = Imm & 0xff;
    334   unsigned Hi8 = (Imm >> 8) & 0xff;
    335   OpLo = AVR::SBCIRdK;
    336   OpHi = AVR::SBCIRdK;
    337   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    338 
    339   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    340     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    341     .addReg(DstLoReg, getKillRegState(SrcIsKill))
    342     .addImm(Lo8);
    343 
    344   // SREG is always implicitly killed
    345   MIBLO->getOperand(4).setIsKill();
    346 
    347   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    348     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    349     .addReg(DstHiReg, getKillRegState(SrcIsKill))
    350     .addImm(Hi8);
    351 
    352   if (ImpIsDead)
    353     MIBHI->getOperand(3).setIsDead();
    354 
    355   // SREG is always implicitly killed
    356   MIBHI->getOperand(4).setIsKill();
    357 
    358   MI.eraseFromParent();
    359   return true;
    360 }
    361 
    362 template <>
    363 bool AVRExpandPseudo::expand<AVR::ANDWRdRr>(Block &MBB, BlockIt MBBI) {
    364   return expandLogic(AVR::ANDRdRr, MBB, MBBI);
    365 }
    366 
    367 template <>
    368 bool AVRExpandPseudo::expand<AVR::ANDIWRdK>(Block &MBB, BlockIt MBBI) {
    369   return expandLogicImm(AVR::ANDIRdK, MBB, MBBI);
    370 }
    371 
    372 template <>
    373 bool AVRExpandPseudo::expand<AVR::ORWRdRr>(Block &MBB, BlockIt MBBI) {
    374   return expandLogic(AVR::ORRdRr, MBB, MBBI);
    375 }
    376 
    377 template <>
    378 bool AVRExpandPseudo::expand<AVR::ORIWRdK>(Block &MBB, BlockIt MBBI) {
    379   return expandLogicImm(AVR::ORIRdK, MBB, MBBI);
    380 }
    381 
    382 template <>
    383 bool AVRExpandPseudo::expand<AVR::EORWRdRr>(Block &MBB, BlockIt MBBI) {
    384   return expandLogic(AVR::EORRdRr, MBB, MBBI);
    385 }
    386 
    387 template <>
    388 bool AVRExpandPseudo::expand<AVR::COMWRd>(Block &MBB, BlockIt MBBI) {
    389   MachineInstr &MI = *MBBI;
    390   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    391   unsigned DstReg = MI.getOperand(0).getReg();
    392   bool DstIsDead = MI.getOperand(0).isDead();
    393   bool DstIsKill = MI.getOperand(1).isKill();
    394   bool ImpIsDead = MI.getOperand(2).isDead();
    395   OpLo = AVR::COMRd;
    396   OpHi = AVR::COMRd;
    397   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    398 
    399   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    400     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    401     .addReg(DstLoReg, getKillRegState(DstIsKill));
    402 
    403   // SREG is always implicitly dead
    404   MIBLO->getOperand(2).setIsDead();
    405 
    406   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    407     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    408     .addReg(DstHiReg, getKillRegState(DstIsKill));
    409 
    410   if (ImpIsDead)
    411     MIBHI->getOperand(2).setIsDead();
    412 
    413   MI.eraseFromParent();
    414   return true;
    415 }
    416 
    417 template <>
    418 bool AVRExpandPseudo::expand<AVR::CPWRdRr>(Block &MBB, BlockIt MBBI) {
    419   MachineInstr &MI = *MBBI;
    420   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg, DstLoReg, DstHiReg;
    421   unsigned DstReg = MI.getOperand(0).getReg();
    422   unsigned SrcReg = MI.getOperand(1).getReg();
    423   bool DstIsKill = MI.getOperand(0).isKill();
    424   bool SrcIsKill = MI.getOperand(1).isKill();
    425   bool ImpIsDead = MI.getOperand(2).isDead();
    426   OpLo = AVR::CPRdRr;
    427   OpHi = AVR::CPCRdRr;
    428   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
    429   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    430 
    431   // Low part
    432   buildMI(MBB, MBBI, OpLo)
    433     .addReg(DstLoReg, getKillRegState(DstIsKill))
    434     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
    435 
    436   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    437     .addReg(DstHiReg, getKillRegState(DstIsKill))
    438     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
    439 
    440   if (ImpIsDead)
    441     MIBHI->getOperand(2).setIsDead();
    442 
    443   // SREG is always implicitly killed
    444   MIBHI->getOperand(3).setIsKill();
    445 
    446   MI.eraseFromParent();
    447   return true;
    448 }
    449 
    450 template <>
    451 bool AVRExpandPseudo::expand<AVR::CPCWRdRr>(Block &MBB, BlockIt MBBI) {
    452   MachineInstr &MI = *MBBI;
    453   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg, DstLoReg, DstHiReg;
    454   unsigned DstReg = MI.getOperand(0).getReg();
    455   unsigned SrcReg = MI.getOperand(1).getReg();
    456   bool DstIsKill = MI.getOperand(0).isKill();
    457   bool SrcIsKill = MI.getOperand(1).isKill();
    458   bool ImpIsDead = MI.getOperand(2).isDead();
    459   OpLo = AVR::CPCRdRr;
    460   OpHi = AVR::CPCRdRr;
    461   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
    462   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    463 
    464   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    465     .addReg(DstLoReg, getKillRegState(DstIsKill))
    466     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
    467 
    468   // SREG is always implicitly killed
    469   MIBLO->getOperand(3).setIsKill();
    470 
    471   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    472     .addReg(DstHiReg, getKillRegState(DstIsKill))
    473     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
    474 
    475   if (ImpIsDead)
    476     MIBHI->getOperand(2).setIsDead();
    477 
    478   // SREG is always implicitly killed
    479   MIBHI->getOperand(3).setIsKill();
    480 
    481   MI.eraseFromParent();
    482   return true;
    483 }
    484 
    485 template <>
    486 bool AVRExpandPseudo::expand<AVR::LDIWRdK>(Block &MBB, BlockIt MBBI) {
    487   MachineInstr &MI = *MBBI;
    488   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    489   unsigned DstReg = MI.getOperand(0).getReg();
    490   bool DstIsDead = MI.getOperand(0).isDead();
    491   OpLo = AVR::LDIRdK;
    492   OpHi = AVR::LDIRdK;
    493   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    494 
    495   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    496     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead));
    497 
    498   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    499     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead));
    500 
    501   switch (MI.getOperand(1).getType()) {
    502   case MachineOperand::MO_GlobalAddress: {
    503     const GlobalValue *GV = MI.getOperand(1).getGlobal();
    504     int64_t Offs = MI.getOperand(1).getOffset();
    505     unsigned TF = MI.getOperand(1).getTargetFlags();
    506 
    507     MIBLO.addGlobalAddress(GV, Offs, TF | AVRII::MO_LO);
    508     MIBHI.addGlobalAddress(GV, Offs, TF | AVRII::MO_HI);
    509     break;
    510   }
    511   case MachineOperand::MO_BlockAddress: {
    512     const BlockAddress *BA = MI.getOperand(1).getBlockAddress();
    513     unsigned TF = MI.getOperand(1).getTargetFlags();
    514 
    515     MIBLO.add(MachineOperand::CreateBA(BA, TF | AVRII::MO_LO));
    516     MIBHI.add(MachineOperand::CreateBA(BA, TF | AVRII::MO_HI));
    517     break;
    518   }
    519   case MachineOperand::MO_Immediate: {
    520     unsigned Imm = MI.getOperand(1).getImm();
    521 
    522     MIBLO.addImm(Imm & 0xff);
    523     MIBHI.addImm((Imm >> 8) & 0xff);
    524     break;
    525   }
    526   default:
    527     llvm_unreachable("Unknown operand type!");
    528   }
    529 
    530   MI.eraseFromParent();
    531   return true;
    532 }
    533 
    534 template <>
    535 bool AVRExpandPseudo::expand<AVR::LDSWRdK>(Block &MBB, BlockIt MBBI) {
    536   MachineInstr &MI = *MBBI;
    537   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    538   unsigned DstReg = MI.getOperand(0).getReg();
    539   bool DstIsDead = MI.getOperand(0).isDead();
    540   OpLo = AVR::LDSRdK;
    541   OpHi = AVR::LDSRdK;
    542   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    543 
    544   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    545     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead));
    546 
    547   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    548     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead));
    549 
    550   switch (MI.getOperand(1).getType()) {
    551   case MachineOperand::MO_GlobalAddress: {
    552     const GlobalValue *GV = MI.getOperand(1).getGlobal();
    553     int64_t Offs = MI.getOperand(1).getOffset();
    554     unsigned TF = MI.getOperand(1).getTargetFlags();
    555 
    556     MIBLO.addGlobalAddress(GV, Offs, TF);
    557     MIBHI.addGlobalAddress(GV, Offs + 1, TF);
    558     break;
    559   }
    560   case MachineOperand::MO_Immediate: {
    561     unsigned Imm = MI.getOperand(1).getImm();
    562 
    563     MIBLO.addImm(Imm);
    564     MIBHI.addImm(Imm + 1);
    565     break;
    566   }
    567   default:
    568     llvm_unreachable("Unknown operand type!");
    569   }
    570 
    571   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    572   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    573 
    574   MI.eraseFromParent();
    575   return true;
    576 }
    577 
    578 template <>
    579 bool AVRExpandPseudo::expand<AVR::LDWRdPtr>(Block &MBB, BlockIt MBBI) {
    580   MachineInstr &MI = *MBBI;
    581   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    582   unsigned DstReg = MI.getOperand(0).getReg();
    583   unsigned TmpReg = 0; // 0 for no temporary register
    584   unsigned SrcReg = MI.getOperand(1).getReg();
    585   bool SrcIsKill = MI.getOperand(1).isKill();
    586   OpLo = AVR::LDRdPtrPi;
    587   OpHi = AVR::LDRdPtr;
    588   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    589 
    590   // Use a temporary register if src and dst registers are the same.
    591   if (DstReg == SrcReg)
    592     TmpReg = scavengeGPR8(MI);
    593 
    594   unsigned CurDstLoReg = (DstReg == SrcReg) ? TmpReg : DstLoReg;
    595   unsigned CurDstHiReg = (DstReg == SrcReg) ? TmpReg : DstHiReg;
    596 
    597   // Load low byte.
    598   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    599     .addReg(CurDstLoReg, RegState::Define)
    600     .addReg(SrcReg, RegState::Define)
    601     .addReg(SrcReg);
    602 
    603   // Push low byte onto stack if necessary.
    604   if (TmpReg)
    605     buildMI(MBB, MBBI, AVR::PUSHRr).addReg(TmpReg);
    606 
    607   // Load high byte.
    608   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    609     .addReg(CurDstHiReg, RegState::Define)
    610     .addReg(SrcReg, getKillRegState(SrcIsKill));
    611 
    612   if (TmpReg) {
    613     // Move the high byte into the final destination.
    614     buildMI(MBB, MBBI, AVR::MOVRdRr).addReg(DstHiReg).addReg(TmpReg);
    615 
    616     // Move the low byte from the scratch space into the final destination.
    617     buildMI(MBB, MBBI, AVR::POPRd).addReg(DstLoReg);
    618   }
    619 
    620   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    621   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    622 
    623   MI.eraseFromParent();
    624   return true;
    625 }
    626 
    627 template <>
    628 bool AVRExpandPseudo::expand<AVR::LDWRdPtrPi>(Block &MBB, BlockIt MBBI) {
    629   MachineInstr &MI = *MBBI;
    630   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    631   unsigned DstReg = MI.getOperand(0).getReg();
    632   unsigned SrcReg = MI.getOperand(1).getReg();
    633   bool DstIsDead = MI.getOperand(0).isDead();
    634   bool SrcIsDead = MI.getOperand(1).isKill();
    635   OpLo = AVR::LDRdPtrPi;
    636   OpHi = AVR::LDRdPtrPi;
    637   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    638 
    639   assert(DstReg != SrcReg && "SrcReg and DstReg cannot be the same");
    640 
    641   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    642     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    643     .addReg(SrcReg, RegState::Define)
    644     .addReg(SrcReg, RegState::Kill);
    645 
    646   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    647     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    648     .addReg(SrcReg, RegState::Define | getDeadRegState(SrcIsDead))
    649     .addReg(SrcReg, RegState::Kill);
    650 
    651   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    652   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    653 
    654   MI.eraseFromParent();
    655   return true;
    656 }
    657 
    658 template <>
    659 bool AVRExpandPseudo::expand<AVR::LDWRdPtrPd>(Block &MBB, BlockIt MBBI) {
    660   MachineInstr &MI = *MBBI;
    661   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    662   unsigned DstReg = MI.getOperand(0).getReg();
    663   unsigned SrcReg = MI.getOperand(1).getReg();
    664   bool DstIsDead = MI.getOperand(0).isDead();
    665   bool SrcIsDead = MI.getOperand(1).isKill();
    666   OpLo = AVR::LDRdPtrPd;
    667   OpHi = AVR::LDRdPtrPd;
    668   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    669 
    670   assert(DstReg != SrcReg && "SrcReg and DstReg cannot be the same");
    671 
    672   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    673     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
    674     .addReg(SrcReg, RegState::Define)
    675     .addReg(SrcReg, RegState::Kill);
    676 
    677   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    678     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
    679     .addReg(SrcReg, RegState::Define | getDeadRegState(SrcIsDead))
    680     .addReg(SrcReg, RegState::Kill);
    681 
    682   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    683   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    684 
    685   MI.eraseFromParent();
    686   return true;
    687 }
    688 
    689 template <>
    690 bool AVRExpandPseudo::expand<AVR::LDDWRdPtrQ>(Block &MBB, BlockIt MBBI) {
    691   MachineInstr &MI = *MBBI;
    692   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    693   unsigned DstReg = MI.getOperand(0).getReg();
    694   unsigned TmpReg = 0; // 0 for no temporary register
    695   unsigned SrcReg = MI.getOperand(1).getReg();
    696   unsigned Imm = MI.getOperand(2).getImm();
    697   bool SrcIsKill = MI.getOperand(1).isKill();
    698   OpLo = AVR::LDDRdPtrQ;
    699   OpHi = AVR::LDDRdPtrQ;
    700   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    701 
    702   // Since we add 1 to the Imm value for the high byte below, and 63 is the highest Imm value
    703   // allowed for the instruction, 62 is the limit here.
    704   assert(Imm <= 62 && "Offset is out of range");
    705 
    706   // Use a temporary register if src and dst registers are the same.
    707   if (DstReg == SrcReg)
    708     TmpReg = scavengeGPR8(MI);
    709 
    710   unsigned CurDstLoReg = (DstReg == SrcReg) ? TmpReg : DstLoReg;
    711   unsigned CurDstHiReg = (DstReg == SrcReg) ? TmpReg : DstHiReg;
    712 
    713   // Load low byte.
    714   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    715     .addReg(CurDstLoReg, RegState::Define)
    716     .addReg(SrcReg)
    717     .addImm(Imm);
    718 
    719   // Push low byte onto stack if necessary.
    720   if (TmpReg)
    721     buildMI(MBB, MBBI, AVR::PUSHRr).addReg(TmpReg);
    722 
    723   // Load high byte.
    724   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    725     .addReg(CurDstHiReg, RegState::Define)
    726     .addReg(SrcReg, getKillRegState(SrcIsKill))
    727     .addImm(Imm + 1);
    728 
    729   if (TmpReg) {
    730     // Move the high byte into the final destination.
    731     buildMI(MBB, MBBI, AVR::MOVRdRr).addReg(DstHiReg).addReg(TmpReg);
    732 
    733     // Move the low byte from the scratch space into the final destination.
    734     buildMI(MBB, MBBI, AVR::POPRd).addReg(DstLoReg);
    735   }
    736 
    737   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    738   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    739 
    740   MI.eraseFromParent();
    741   return true;
    742 }
    743 
    744 template <>
    745 bool AVRExpandPseudo::expand<AVR::LPMWRdZ>(Block &MBB, BlockIt MBBI) {
    746   MachineInstr &MI = *MBBI;
    747   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
    748   unsigned DstReg = MI.getOperand(0).getReg();
    749   unsigned TmpReg = 0; // 0 for no temporary register
    750   unsigned SrcReg = MI.getOperand(1).getReg();
    751   bool SrcIsKill = MI.getOperand(1).isKill();
    752   OpLo = AVR::LPMRdZPi;
    753   OpHi = AVR::LPMRdZ;
    754   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
    755 
    756   // Use a temporary register if src and dst registers are the same.
    757   if (DstReg == SrcReg)
    758     TmpReg = scavengeGPR8(MI);
    759 
    760   unsigned CurDstLoReg = (DstReg == SrcReg) ? TmpReg : DstLoReg;
    761   unsigned CurDstHiReg = (DstReg == SrcReg) ? TmpReg : DstHiReg;
    762 
    763   // Load low byte.
    764   auto MIBLO = buildMI(MBB, MBBI, OpLo)
    765       .addReg(CurDstLoReg, RegState::Define)
    766       .addReg(SrcReg);
    767 
    768   // Push low byte onto stack if necessary.
    769   if (TmpReg)
    770     buildMI(MBB, MBBI, AVR::PUSHRr).addReg(TmpReg);
    771 
    772   // Load high byte.
    773   auto MIBHI = buildMI(MBB, MBBI, OpHi)
    774       .addReg(CurDstHiReg, RegState::Define)
    775       .addReg(SrcReg, getKillRegState(SrcIsKill));
    776 
    777   if (TmpReg) {
    778     // Move the high byte into the final destination.
    779     buildMI(MBB, MBBI, AVR::MOVRdRr).addReg(DstHiReg).addReg(TmpReg);
    780 
    781     // Move the low byte from the scratch space into the final destination.
    782     buildMI(MBB, MBBI, AVR::POPRd).addReg(DstLoReg);
    783   }
    784 
    785   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    786   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
    787 
    788   MI.eraseFromParent();
    789   return true;
    790 }
    791 
    792 template <>
    793 bool AVRExpandPseudo::expand<AVR::LPMWRdZPi>(Block &MBB, BlockIt MBBI) {
    794   llvm_unreachable("wide LPMPi is unimplemented");
    795 }
    796 
    797 template<typename Func>
    798 bool AVRExpandPseudo::expandAtomic(Block &MBB, BlockIt MBBI, Func f) {
    799   // Remove the pseudo instruction.
    800   MachineInstr &MI = *MBBI;
    801 
    802   // Store the SREG.
    803   buildMI(MBB, MBBI, AVR::INRdA)
    804     .addReg(SCRATCH_REGISTER, RegState::Define)
    805     .addImm(SREG_ADDR);
    806 
    807   // Disable exceptions.
    808   buildMI(MBB, MBBI, AVR::BCLRs).addImm(7); // CLI
    809 
    810   f(MI);
    811 
    812   // Restore the status reg.
    813   buildMI(MBB, MBBI, AVR::OUTARr)
    814     .addImm(SREG_ADDR)
    815     .addReg(SCRATCH_REGISTER);
    816 
    817   MI.eraseFromParent();
    818   return true;
    819 }
    820 
    821 template<typename Func>
    822 bool AVRExpandPseudo::expandAtomicBinaryOp(unsigned Opcode,
    823                                            Block &MBB,
    824                                            BlockIt MBBI,
    825                                            Func f) {
    826   return expandAtomic(MBB, MBBI, [&](MachineInstr &MI) {
    827       auto Op1 = MI.getOperand(0);
    828       auto Op2 = MI.getOperand(1);
    829 
    830       MachineInstr &NewInst =
    831           *buildMI(MBB, MBBI, Opcode).add(Op1).add(Op2).getInstr();
    832       f(NewInst);
    833   });
    834 }
    835 
    836 bool AVRExpandPseudo::expandAtomicBinaryOp(unsigned Opcode,
    837                                            Block &MBB,
    838                                            BlockIt MBBI) {
    839   return expandAtomicBinaryOp(Opcode, MBB, MBBI, [](MachineInstr &MI) {});
    840 }
    841 
    842 bool AVRExpandPseudo::expandAtomicArithmeticOp(unsigned Width,
    843                                                unsigned ArithOpcode,
    844                                                Block &MBB,
    845                                                BlockIt MBBI) {
    846   return expandAtomic(MBB, MBBI, [&](MachineInstr &MI) {
    847       auto Op1 = MI.getOperand(0);
    848       auto Op2 = MI.getOperand(1);
    849 
    850       unsigned LoadOpcode = (Width == 8) ? AVR::LDRdPtr : AVR::LDWRdPtr;
    851       unsigned StoreOpcode = (Width == 8) ? AVR::STPtrRr : AVR::STWPtrRr;
    852 
    853       // Create the load
    854       buildMI(MBB, MBBI, LoadOpcode).add(Op1).add(Op2);
    855 
    856       // Create the arithmetic op
    857       buildMI(MBB, MBBI, ArithOpcode).add(Op1).add(Op1).add(Op2);
    858 
    859       // Create the store
    860       buildMI(MBB, MBBI, StoreOpcode).add(Op2).add(Op1);
    861   });
    862 }
    863 
    864 unsigned AVRExpandPseudo::scavengeGPR8(MachineInstr &MI) {
    865   MachineBasicBlock &MBB = *MI.getParent();
    866   RegScavenger RS;
    867 
    868   RS.enterBasicBlock(MBB);
    869   RS.forward(MI);
    870 
    871   BitVector Candidates =
    872       TRI->getAllocatableSet
    873       (*MBB.getParent(), &AVR::GPR8RegClass);
    874 
    875   // Exclude all the registers being used by the instruction.
    876   for (MachineOperand &MO : MI.operands()) {
    877     if (MO.isReg() && MO.getReg() != 0 && !MO.isDef() &&
    878         !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
    879       Candidates.reset(MO.getReg());
    880   }
    881 
    882   BitVector Available = RS.getRegsAvailable(&AVR::GPR8RegClass);
    883   Available &= Candidates;
    884 
    885   signed Reg = Available.find_first();
    886   assert(Reg != -1 && "ran out of registers");
    887   return Reg;
    888 }
    889 
    890 template<>
    891 bool AVRExpandPseudo::expand<AVR::AtomicLoad8>(Block &MBB, BlockIt MBBI) {
    892   return expandAtomicBinaryOp(AVR::LDRdPtr, MBB, MBBI);
    893 }
    894 
    895 template<>
    896 bool AVRExpandPseudo::expand<AVR::AtomicLoad16>(Block &MBB, BlockIt MBBI) {
    897   return expandAtomicBinaryOp(AVR::LDWRdPtr, MBB, MBBI);
    898 }
    899 
    900 template<>
    901 bool AVRExpandPseudo::expand<AVR::AtomicStore8>(Block &MBB, BlockIt MBBI) {
    902   return expandAtomicBinaryOp(AVR::STPtrRr, MBB, MBBI);
    903 }
    904 
    905 template<>
    906 bool AVRExpandPseudo::expand<AVR::AtomicStore16>(Block &MBB, BlockIt MBBI) {
    907   return expandAtomicBinaryOp(AVR::STWPtrRr, MBB, MBBI);
    908 }
    909 
    910 template<>
    911 bool AVRExpandPseudo::expand<AVR::AtomicLoadAdd8>(Block &MBB, BlockIt MBBI) {
    912   return expandAtomicArithmeticOp(8, AVR::ADDRdRr, MBB, MBBI);
    913 }
    914 
    915 template<>
    916 bool AVRExpandPseudo::expand<AVR::AtomicLoadAdd16>(Block &MBB, BlockIt MBBI) {
    917   return expandAtomicArithmeticOp(16, AVR::ADDWRdRr, MBB, MBBI);
    918 }
    919 
    920 template<>
    921 bool AVRExpandPseudo::expand<AVR::AtomicLoadSub8>(Block &MBB, BlockIt MBBI) {
    922   return expandAtomicArithmeticOp(8, AVR::SUBRdRr, MBB, MBBI);
    923 }
    924 
    925 template<>
    926 bool AVRExpandPseudo::expand<AVR::AtomicLoadSub16>(Block &MBB, BlockIt MBBI) {
    927   return expandAtomicArithmeticOp(16, AVR::SUBWRdRr, MBB, MBBI);
    928 }
    929 
    930 template<>
    931 bool AVRExpandPseudo::expand<AVR::AtomicLoadAnd8>(Block &MBB, BlockIt MBBI) {
    932   return expandAtomicArithmeticOp(8, AVR::ANDRdRr, MBB, MBBI);
    933 }
    934 
    935 template<>
    936 bool AVRExpandPseudo::expand<AVR::AtomicLoadAnd16>(Block &MBB, BlockIt MBBI) {
    937   return expandAtomicArithmeticOp(16, AVR::ANDWRdRr, MBB, MBBI);
    938 }
    939 
    940 template<>
    941 bool AVRExpandPseudo::expand<AVR::AtomicLoadOr8>(Block &MBB, BlockIt MBBI) {
    942   return expandAtomicArithmeticOp(8, AVR::ORRdRr, MBB, MBBI);
    943 }
    944 
    945 template<>
    946 bool AVRExpandPseudo::expand<AVR::AtomicLoadOr16>(Block &MBB, BlockIt MBBI) {
    947   return expandAtomicArithmeticOp(16, AVR::ORWRdRr, MBB, MBBI);
    948 }
    949 
    950 template<>
    951 bool AVRExpandPseudo::expand<AVR::AtomicLoadXor8>(Block &MBB, BlockIt MBBI) {
    952   return expandAtomicArithmeticOp(8, AVR::EORRdRr, MBB, MBBI);
    953 }
    954 
    955 template<>
    956 bool AVRExpandPseudo::expand<AVR::AtomicLoadXor16>(Block &MBB, BlockIt MBBI) {
    957   return expandAtomicArithmeticOp(16, AVR::EORWRdRr, MBB, MBBI);
    958 }
    959 
    960 template<>
    961 bool AVRExpandPseudo::expand<AVR::AtomicFence>(Block &MBB, BlockIt MBBI) {
    962   // On AVR, there is only one core and so atomic fences do nothing.
    963   MBBI->eraseFromParent();
    964   return true;
    965 }
    966 
    967 template <>
    968 bool AVRExpandPseudo::expand<AVR::STSWKRr>(Block &MBB, BlockIt MBBI) {
    969   MachineInstr &MI = *MBBI;
    970   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
    971   unsigned SrcReg = MI.getOperand(1).getReg();
    972   bool SrcIsKill = MI.getOperand(1).isKill();
    973   OpLo = AVR::STSKRr;
    974   OpHi = AVR::STSKRr;
    975   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
    976 
    977   // Write the high byte first in case this address belongs to a special
    978   // I/O address with a special temporary register.
    979   auto MIBHI = buildMI(MBB, MBBI, OpHi);
    980   auto MIBLO = buildMI(MBB, MBBI, OpLo);
    981 
    982   switch (MI.getOperand(0).getType()) {
    983   case MachineOperand::MO_GlobalAddress: {
    984     const GlobalValue *GV = MI.getOperand(0).getGlobal();
    985     int64_t Offs = MI.getOperand(0).getOffset();
    986     unsigned TF = MI.getOperand(0).getTargetFlags();
    987 
    988     MIBLO.addGlobalAddress(GV, Offs, TF);
    989     MIBHI.addGlobalAddress(GV, Offs + 1, TF);
    990     break;
    991   }
    992   case MachineOperand::MO_Immediate: {
    993     unsigned Imm = MI.getOperand(0).getImm();
    994 
    995     MIBLO.addImm(Imm);
    996     MIBHI.addImm(Imm + 1);
    997     break;
    998   }
    999   default:
   1000     llvm_unreachable("Unknown operand type!");
   1001   }
   1002 
   1003   MIBLO.addReg(SrcLoReg, getKillRegState(SrcIsKill));
   1004   MIBHI.addReg(SrcHiReg, getKillRegState(SrcIsKill));
   1005 
   1006   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1007   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1008 
   1009   MI.eraseFromParent();
   1010   return true;
   1011 }
   1012 
   1013 template <>
   1014 bool AVRExpandPseudo::expand<AVR::STWPtrRr>(Block &MBB, BlockIt MBBI) {
   1015   MachineInstr &MI = *MBBI;
   1016   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
   1017   unsigned DstReg = MI.getOperand(0).getReg();
   1018   unsigned SrcReg = MI.getOperand(1).getReg();
   1019   bool SrcIsKill = MI.getOperand(1).isKill();
   1020   OpLo = AVR::STPtrRr;
   1021   OpHi = AVR::STDPtrQRr;
   1022   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1023 
   1024   //:TODO: need to reverse this order like inw and stsw?
   1025   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1026     .addReg(DstReg)
   1027     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
   1028 
   1029   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1030     .addReg(DstReg)
   1031     .addImm(1)
   1032     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
   1033 
   1034   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1035   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1036 
   1037   MI.eraseFromParent();
   1038   return true;
   1039 }
   1040 
   1041 template <>
   1042 bool AVRExpandPseudo::expand<AVR::STWPtrPiRr>(Block &MBB, BlockIt MBBI) {
   1043   MachineInstr &MI = *MBBI;
   1044   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
   1045   unsigned DstReg = MI.getOperand(0).getReg();
   1046   unsigned SrcReg = MI.getOperand(2).getReg();
   1047   unsigned Imm = MI.getOperand(3).getImm();
   1048   bool DstIsDead = MI.getOperand(0).isDead();
   1049   bool SrcIsKill = MI.getOperand(2).isKill();
   1050   OpLo = AVR::STPtrPiRr;
   1051   OpHi = AVR::STPtrPiRr;
   1052   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1053 
   1054   assert(DstReg != SrcReg && "SrcReg and DstReg cannot be the same");
   1055 
   1056   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1057     .addReg(DstReg, RegState::Define)
   1058     .addReg(DstReg, RegState::Kill)
   1059     .addReg(SrcLoReg, getKillRegState(SrcIsKill))
   1060     .addImm(Imm);
   1061 
   1062   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1063     .addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead))
   1064     .addReg(DstReg, RegState::Kill)
   1065     .addReg(SrcHiReg, getKillRegState(SrcIsKill))
   1066     .addImm(Imm);
   1067 
   1068   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1069   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1070 
   1071   MI.eraseFromParent();
   1072   return true;
   1073 }
   1074 
   1075 template <>
   1076 bool AVRExpandPseudo::expand<AVR::STWPtrPdRr>(Block &MBB, BlockIt MBBI) {
   1077   MachineInstr &MI = *MBBI;
   1078   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
   1079   unsigned DstReg = MI.getOperand(0).getReg();
   1080   unsigned SrcReg = MI.getOperand(2).getReg();
   1081   unsigned Imm = MI.getOperand(3).getImm();
   1082   bool DstIsDead = MI.getOperand(0).isDead();
   1083   bool SrcIsKill = MI.getOperand(2).isKill();
   1084   OpLo = AVR::STPtrPdRr;
   1085   OpHi = AVR::STPtrPdRr;
   1086   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1087 
   1088   assert(DstReg != SrcReg && "SrcReg and DstReg cannot be the same");
   1089 
   1090   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1091     .addReg(DstReg, RegState::Define)
   1092     .addReg(DstReg, RegState::Kill)
   1093     .addReg(SrcHiReg, getKillRegState(SrcIsKill))
   1094     .addImm(Imm);
   1095 
   1096   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1097     .addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead))
   1098     .addReg(DstReg, RegState::Kill)
   1099     .addReg(SrcLoReg, getKillRegState(SrcIsKill))
   1100     .addImm(Imm);
   1101 
   1102   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1103   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1104 
   1105   MI.eraseFromParent();
   1106   return true;
   1107 }
   1108 
   1109 template <>
   1110 bool AVRExpandPseudo::expand<AVR::STDWPtrQRr>(Block &MBB, BlockIt MBBI) {
   1111   MachineInstr &MI = *MBBI;
   1112   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
   1113   unsigned DstReg = MI.getOperand(0).getReg();
   1114   unsigned SrcReg = MI.getOperand(2).getReg();
   1115   unsigned Imm = MI.getOperand(1).getImm();
   1116   bool DstIsKill = MI.getOperand(0).isKill();
   1117   bool SrcIsKill = MI.getOperand(2).isKill();
   1118   OpLo = AVR::STDPtrQRr;
   1119   OpHi = AVR::STDPtrQRr;
   1120   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1121 
   1122   // Since we add 1 to the Imm value for the high byte below, and 63 is the highest Imm value
   1123   // allowed for the instruction, 62 is the limit here.
   1124   assert(Imm <= 62 && "Offset is out of range");
   1125 
   1126   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1127     .addReg(DstReg)
   1128     .addImm(Imm)
   1129     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
   1130 
   1131   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1132     .addReg(DstReg, getKillRegState(DstIsKill))
   1133     .addImm(Imm + 1)
   1134     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
   1135 
   1136   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1137   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1138 
   1139   MI.eraseFromParent();
   1140   return true;
   1141 }
   1142 
   1143 template <>
   1144 bool AVRExpandPseudo::expand<AVR::INWRdA>(Block &MBB, BlockIt MBBI) {
   1145   MachineInstr &MI = *MBBI;
   1146   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
   1147   unsigned Imm = MI.getOperand(1).getImm();
   1148   unsigned DstReg = MI.getOperand(0).getReg();
   1149   bool DstIsDead = MI.getOperand(0).isDead();
   1150   OpLo = AVR::INRdA;
   1151   OpHi = AVR::INRdA;
   1152   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1153 
   1154   // Since we add 1 to the Imm value for the high byte below, and 63 is the highest Imm value
   1155   // allowed for the instruction, 62 is the limit here.
   1156   assert(Imm <= 62 && "Address is out of range");
   1157 
   1158   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1159     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1160     .addImm(Imm);
   1161 
   1162   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1163     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1164     .addImm(Imm + 1);
   1165 
   1166   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1167   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1168 
   1169   MI.eraseFromParent();
   1170   return true;
   1171 }
   1172 
   1173 template <>
   1174 bool AVRExpandPseudo::expand<AVR::OUTWARr>(Block &MBB, BlockIt MBBI) {
   1175   MachineInstr &MI = *MBBI;
   1176   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
   1177   unsigned Imm = MI.getOperand(0).getImm();
   1178   unsigned SrcReg = MI.getOperand(1).getReg();
   1179   bool SrcIsKill = MI.getOperand(1).isKill();
   1180   OpLo = AVR::OUTARr;
   1181   OpHi = AVR::OUTARr;
   1182   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1183 
   1184   // Since we add 1 to the Imm value for the high byte below, and 63 is the highest Imm value
   1185   // allowed for the instruction, 62 is the limit here.
   1186   assert(Imm <= 62 && "Address is out of range");
   1187 
   1188   // 16 bit I/O writes need the high byte first
   1189   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1190     .addImm(Imm + 1)
   1191     .addReg(SrcHiReg, getKillRegState(SrcIsKill));
   1192 
   1193   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1194     .addImm(Imm)
   1195     .addReg(SrcLoReg, getKillRegState(SrcIsKill));
   1196 
   1197   MIBLO->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1198   MIBHI->setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
   1199 
   1200   MI.eraseFromParent();
   1201   return true;
   1202 }
   1203 
   1204 template <>
   1205 bool AVRExpandPseudo::expand<AVR::PUSHWRr>(Block &MBB, BlockIt MBBI) {
   1206   MachineInstr &MI = *MBBI;
   1207   unsigned OpLo, OpHi, SrcLoReg, SrcHiReg;
   1208   unsigned SrcReg = MI.getOperand(0).getReg();
   1209   bool SrcIsKill = MI.getOperand(0).isKill();
   1210   unsigned Flags = MI.getFlags();
   1211   OpLo = AVR::PUSHRr;
   1212   OpHi = AVR::PUSHRr;
   1213   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1214 
   1215   // Low part
   1216   buildMI(MBB, MBBI, OpLo)
   1217     .addReg(SrcLoReg, getKillRegState(SrcIsKill))
   1218     .setMIFlags(Flags);
   1219 
   1220   // High part
   1221   buildMI(MBB, MBBI, OpHi)
   1222     .addReg(SrcHiReg, getKillRegState(SrcIsKill))
   1223     .setMIFlags(Flags);
   1224 
   1225   MI.eraseFromParent();
   1226   return true;
   1227 }
   1228 
   1229 template <>
   1230 bool AVRExpandPseudo::expand<AVR::POPWRd>(Block &MBB, BlockIt MBBI) {
   1231   MachineInstr &MI = *MBBI;
   1232   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
   1233   unsigned DstReg = MI.getOperand(0).getReg();
   1234   unsigned Flags = MI.getFlags();
   1235   OpLo = AVR::POPRd;
   1236   OpHi = AVR::POPRd;
   1237   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1238 
   1239   buildMI(MBB, MBBI, OpHi, DstHiReg).setMIFlags(Flags); // High
   1240   buildMI(MBB, MBBI, OpLo, DstLoReg).setMIFlags(Flags); // Low
   1241 
   1242   MI.eraseFromParent();
   1243   return true;
   1244 }
   1245 
   1246 template <>
   1247 bool AVRExpandPseudo::expand<AVR::LSLWRd>(Block &MBB, BlockIt MBBI) {
   1248   MachineInstr &MI = *MBBI;
   1249   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
   1250   unsigned DstReg = MI.getOperand(0).getReg();
   1251   bool DstIsDead = MI.getOperand(0).isDead();
   1252   bool DstIsKill = MI.getOperand(1).isKill();
   1253   bool ImpIsDead = MI.getOperand(2).isDead();
   1254   OpLo = AVR::LSLRd;
   1255   OpHi = AVR::ROLRd;
   1256   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1257 
   1258   // Low part
   1259   buildMI(MBB, MBBI, OpLo)
   1260     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1261     .addReg(DstLoReg, getKillRegState(DstIsKill));
   1262 
   1263   auto MIBHI = buildMI(MBB, MBBI, OpHi)
   1264     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1265     .addReg(DstHiReg, getKillRegState(DstIsKill));
   1266 
   1267   if (ImpIsDead)
   1268     MIBHI->getOperand(2).setIsDead();
   1269 
   1270   // SREG is always implicitly killed
   1271   MIBHI->getOperand(3).setIsKill();
   1272 
   1273   MI.eraseFromParent();
   1274   return true;
   1275 }
   1276 
   1277 template <>
   1278 bool AVRExpandPseudo::expand<AVR::LSRWRd>(Block &MBB, BlockIt MBBI) {
   1279   MachineInstr &MI = *MBBI;
   1280   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
   1281   unsigned DstReg = MI.getOperand(0).getReg();
   1282   bool DstIsDead = MI.getOperand(0).isDead();
   1283   bool DstIsKill = MI.getOperand(1).isKill();
   1284   bool ImpIsDead = MI.getOperand(2).isDead();
   1285   OpLo = AVR::RORRd;
   1286   OpHi = AVR::LSRRd;
   1287   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1288 
   1289   // High part
   1290   buildMI(MBB, MBBI, OpHi)
   1291     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1292     .addReg(DstHiReg, getKillRegState(DstIsKill));
   1293 
   1294   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1295     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1296     .addReg(DstLoReg, getKillRegState(DstIsKill));
   1297 
   1298   if (ImpIsDead)
   1299     MIBLO->getOperand(2).setIsDead();
   1300 
   1301   // SREG is always implicitly killed
   1302   MIBLO->getOperand(3).setIsKill();
   1303 
   1304   MI.eraseFromParent();
   1305   return true;
   1306 }
   1307 
   1308 template <>
   1309 bool AVRExpandPseudo::expand<AVR::RORWRd>(Block &MBB, BlockIt MBBI) {
   1310   llvm_unreachable("RORW unimplemented");
   1311   return false;
   1312 }
   1313 
   1314 template <>
   1315 bool AVRExpandPseudo::expand<AVR::ROLWRd>(Block &MBB, BlockIt MBBI) {
   1316   llvm_unreachable("ROLW unimplemented");
   1317   return false;
   1318 }
   1319 
   1320 template <>
   1321 bool AVRExpandPseudo::expand<AVR::ASRWRd>(Block &MBB, BlockIt MBBI) {
   1322   MachineInstr &MI = *MBBI;
   1323   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
   1324   unsigned DstReg = MI.getOperand(0).getReg();
   1325   bool DstIsDead = MI.getOperand(0).isDead();
   1326   bool DstIsKill = MI.getOperand(1).isKill();
   1327   bool ImpIsDead = MI.getOperand(2).isDead();
   1328   OpLo = AVR::RORRd;
   1329   OpHi = AVR::ASRRd;
   1330   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1331 
   1332   // High part
   1333   buildMI(MBB, MBBI, OpHi)
   1334     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1335     .addReg(DstHiReg, getKillRegState(DstIsKill));
   1336 
   1337   auto MIBLO = buildMI(MBB, MBBI, OpLo)
   1338     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1339     .addReg(DstLoReg, getKillRegState(DstIsKill));
   1340 
   1341   if (ImpIsDead)
   1342     MIBLO->getOperand(2).setIsDead();
   1343 
   1344   // SREG is always implicitly killed
   1345   MIBLO->getOperand(3).setIsKill();
   1346 
   1347   MI.eraseFromParent();
   1348   return true;
   1349 }
   1350 
   1351 template <> bool AVRExpandPseudo::expand<AVR::SEXT>(Block &MBB, BlockIt MBBI) {
   1352   MachineInstr &MI = *MBBI;
   1353   unsigned DstLoReg, DstHiReg;
   1354   // sext R17:R16, R17
   1355   // mov     r16, r17
   1356   // lsl     r17
   1357   // sbc     r17, r17
   1358   // sext R17:R16, R13
   1359   // mov     r16, r13
   1360   // mov     r17, r13
   1361   // lsl     r17
   1362   // sbc     r17, r17
   1363   // sext R17:R16, R16
   1364   // mov     r17, r16
   1365   // lsl     r17
   1366   // sbc     r17, r17
   1367   unsigned DstReg = MI.getOperand(0).getReg();
   1368   unsigned SrcReg = MI.getOperand(1).getReg();
   1369   bool DstIsDead = MI.getOperand(0).isDead();
   1370   bool SrcIsKill = MI.getOperand(1).isKill();
   1371   bool ImpIsDead = MI.getOperand(2).isDead();
   1372   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1373 
   1374   if (SrcReg != DstLoReg) {
   1375     auto MOV = buildMI(MBB, MBBI, AVR::MOVRdRr)
   1376       .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1377       .addReg(SrcReg);
   1378 
   1379     if (SrcReg == DstHiReg) {
   1380       MOV->getOperand(1).setIsKill();
   1381     }
   1382   }
   1383 
   1384   if (SrcReg != DstHiReg) {
   1385     buildMI(MBB, MBBI, AVR::MOVRdRr)
   1386       .addReg(DstHiReg, RegState::Define)
   1387       .addReg(SrcReg, getKillRegState(SrcIsKill));
   1388   }
   1389 
   1390   buildMI(MBB, MBBI, AVR::LSLRd)
   1391     .addReg(DstHiReg, RegState::Define)
   1392     .addReg(DstHiReg, RegState::Kill);
   1393 
   1394   auto SBC = buildMI(MBB, MBBI, AVR::SBCRdRr)
   1395     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1396     .addReg(DstHiReg, RegState::Kill)
   1397     .addReg(DstHiReg, RegState::Kill);
   1398 
   1399   if (ImpIsDead)
   1400     SBC->getOperand(3).setIsDead();
   1401 
   1402   // SREG is always implicitly killed
   1403   SBC->getOperand(4).setIsKill();
   1404 
   1405   MI.eraseFromParent();
   1406   return true;
   1407 }
   1408 
   1409 template <> bool AVRExpandPseudo::expand<AVR::ZEXT>(Block &MBB, BlockIt MBBI) {
   1410   MachineInstr &MI = *MBBI;
   1411   unsigned DstLoReg, DstHiReg;
   1412   // zext R25:R24, R20
   1413   // mov      R24, R20
   1414   // eor      R25, R25
   1415   // zext R25:R24, R24
   1416   // eor      R25, R25
   1417   // zext R25:R24, R25
   1418   // mov      R24, R25
   1419   // eor      R25, R25
   1420   unsigned DstReg = MI.getOperand(0).getReg();
   1421   unsigned SrcReg = MI.getOperand(1).getReg();
   1422   bool DstIsDead = MI.getOperand(0).isDead();
   1423   bool SrcIsKill = MI.getOperand(1).isKill();
   1424   bool ImpIsDead = MI.getOperand(2).isDead();
   1425   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1426 
   1427   if (SrcReg != DstLoReg) {
   1428     buildMI(MBB, MBBI, AVR::MOVRdRr)
   1429       .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1430       .addReg(SrcReg, getKillRegState(SrcIsKill));
   1431   }
   1432 
   1433   auto EOR = buildMI(MBB, MBBI, AVR::EORRdRr)
   1434     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1435     .addReg(DstHiReg, RegState::Kill)
   1436     .addReg(DstHiReg, RegState::Kill);
   1437 
   1438   if (ImpIsDead)
   1439     EOR->getOperand(3).setIsDead();
   1440 
   1441   MI.eraseFromParent();
   1442   return true;
   1443 }
   1444 
   1445 template <>
   1446 bool AVRExpandPseudo::expand<AVR::SPREAD>(Block &MBB, BlockIt MBBI) {
   1447   MachineInstr &MI = *MBBI;
   1448   unsigned OpLo, OpHi, DstLoReg, DstHiReg;
   1449   unsigned DstReg = MI.getOperand(0).getReg();
   1450   bool DstIsDead = MI.getOperand(0).isDead();
   1451   unsigned Flags = MI.getFlags();
   1452   OpLo = AVR::INRdA;
   1453   OpHi = AVR::INRdA;
   1454   TRI->splitReg(DstReg, DstLoReg, DstHiReg);
   1455 
   1456   // Low part
   1457   buildMI(MBB, MBBI, OpLo)
   1458     .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead))
   1459     .addImm(0x3d)
   1460     .setMIFlags(Flags);
   1461 
   1462   // High part
   1463   buildMI(MBB, MBBI, OpHi)
   1464     .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead))
   1465     .addImm(0x3e)
   1466     .setMIFlags(Flags);
   1467 
   1468   MI.eraseFromParent();
   1469   return true;
   1470 }
   1471 
   1472 template <>
   1473 bool AVRExpandPseudo::expand<AVR::SPWRITE>(Block &MBB, BlockIt MBBI) {
   1474   MachineInstr &MI = *MBBI;
   1475   unsigned SrcLoReg, SrcHiReg;
   1476   unsigned SrcReg = MI.getOperand(1).getReg();
   1477   bool SrcIsKill = MI.getOperand(1).isKill();
   1478   unsigned Flags = MI.getFlags();
   1479   TRI->splitReg(SrcReg, SrcLoReg, SrcHiReg);
   1480 
   1481   buildMI(MBB, MBBI, AVR::INRdA)
   1482     .addReg(AVR::R0, RegState::Define)
   1483     .addImm(SREG_ADDR)
   1484     .setMIFlags(Flags);
   1485 
   1486   buildMI(MBB, MBBI, AVR::BCLRs).addImm(0x07).setMIFlags(Flags);
   1487 
   1488   buildMI(MBB, MBBI, AVR::OUTARr)
   1489     .addImm(0x3e)
   1490     .addReg(SrcHiReg, getKillRegState(SrcIsKill))
   1491     .setMIFlags(Flags);
   1492 
   1493   buildMI(MBB, MBBI, AVR::OUTARr)
   1494     .addImm(SREG_ADDR)
   1495     .addReg(AVR::R0, RegState::Kill)
   1496     .setMIFlags(Flags);
   1497 
   1498   buildMI(MBB, MBBI, AVR::OUTARr)
   1499     .addImm(0x3d)
   1500     .addReg(SrcLoReg, getKillRegState(SrcIsKill))
   1501     .setMIFlags(Flags);
   1502 
   1503   MI.eraseFromParent();
   1504   return true;
   1505 }
   1506 
   1507 bool AVRExpandPseudo::expandMI(Block &MBB, BlockIt MBBI) {
   1508   MachineInstr &MI = *MBBI;
   1509   int Opcode = MBBI->getOpcode();
   1510 
   1511 #define EXPAND(Op)               \
   1512   case Op:                       \
   1513     return expand<Op>(MBB, MI)
   1514 
   1515   switch (Opcode) {
   1516     EXPAND(AVR::ADDWRdRr);
   1517     EXPAND(AVR::ADCWRdRr);
   1518     EXPAND(AVR::SUBWRdRr);
   1519     EXPAND(AVR::SUBIWRdK);
   1520     EXPAND(AVR::SBCWRdRr);
   1521     EXPAND(AVR::SBCIWRdK);
   1522     EXPAND(AVR::ANDWRdRr);
   1523     EXPAND(AVR::ANDIWRdK);
   1524     EXPAND(AVR::ORWRdRr);
   1525     EXPAND(AVR::ORIWRdK);
   1526     EXPAND(AVR::EORWRdRr);
   1527     EXPAND(AVR::COMWRd);
   1528     EXPAND(AVR::CPWRdRr);
   1529     EXPAND(AVR::CPCWRdRr);
   1530     EXPAND(AVR::LDIWRdK);
   1531     EXPAND(AVR::LDSWRdK);
   1532     EXPAND(AVR::LDWRdPtr);
   1533     EXPAND(AVR::LDWRdPtrPi);
   1534     EXPAND(AVR::LDWRdPtrPd);
   1535   case AVR::LDDWRdYQ: //:FIXME: remove this once PR13375 gets fixed
   1536     EXPAND(AVR::LDDWRdPtrQ);
   1537     EXPAND(AVR::LPMWRdZ);
   1538     EXPAND(AVR::LPMWRdZPi);
   1539     EXPAND(AVR::AtomicLoad8);
   1540     EXPAND(AVR::AtomicLoad16);
   1541     EXPAND(AVR::AtomicStore8);
   1542     EXPAND(AVR::AtomicStore16);
   1543     EXPAND(AVR::AtomicLoadAdd8);
   1544     EXPAND(AVR::AtomicLoadAdd16);
   1545     EXPAND(AVR::AtomicLoadSub8);
   1546     EXPAND(AVR::AtomicLoadSub16);
   1547     EXPAND(AVR::AtomicLoadAnd8);
   1548     EXPAND(AVR::AtomicLoadAnd16);
   1549     EXPAND(AVR::AtomicLoadOr8);
   1550     EXPAND(AVR::AtomicLoadOr16);
   1551     EXPAND(AVR::AtomicLoadXor8);
   1552     EXPAND(AVR::AtomicLoadXor16);
   1553     EXPAND(AVR::AtomicFence);
   1554     EXPAND(AVR::STSWKRr);
   1555     EXPAND(AVR::STWPtrRr);
   1556     EXPAND(AVR::STWPtrPiRr);
   1557     EXPAND(AVR::STWPtrPdRr);
   1558     EXPAND(AVR::STDWPtrQRr);
   1559     EXPAND(AVR::INWRdA);
   1560     EXPAND(AVR::OUTWARr);
   1561     EXPAND(AVR::PUSHWRr);
   1562     EXPAND(AVR::POPWRd);
   1563     EXPAND(AVR::LSLWRd);
   1564     EXPAND(AVR::LSRWRd);
   1565     EXPAND(AVR::RORWRd);
   1566     EXPAND(AVR::ROLWRd);
   1567     EXPAND(AVR::ASRWRd);
   1568     EXPAND(AVR::SEXT);
   1569     EXPAND(AVR::ZEXT);
   1570     EXPAND(AVR::SPREAD);
   1571     EXPAND(AVR::SPWRITE);
   1572   }
   1573 #undef EXPAND
   1574   return false;
   1575 }
   1576 
   1577 } // end of anonymous namespace
   1578 
   1579 INITIALIZE_PASS(AVRExpandPseudo, "avr-expand-pseudo",
   1580                 AVR_EXPAND_PSEUDO_NAME, false, false)
   1581 namespace llvm {
   1582 
   1583 FunctionPass *createAVRExpandPseudoPass() { return new AVRExpandPseudo(); }
   1584 
   1585 } // end of namespace llvm
   1586