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