]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
Merge OpenSSL 1.0.2p.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / AVR / AVRExpandPseudoInsts.cpp
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