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