blob: 0ab54a8d56d100dafccf58408723f9cede411244 [file] [log] [blame]
Dylan McKay6d8078f2016-05-06 10:12:31 +00001//===-- AVRInstrInfo.cpp - AVR Instruction Information --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the AVR implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "AVRInstrInfo.h"
15
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/CodeGen/MachineConstantPool.h"
18#include "llvm/CodeGen/MachineFrameInfo.h"
19#include "llvm/CodeGen/MachineInstrBuilder.h"
20#include "llvm/CodeGen/MachineMemOperand.h"
21#include "llvm/IR/Constants.h"
22#include "llvm/IR/Function.h"
23#include "llvm/MC/MCContext.h"
24#include "llvm/Support/Debug.h"
25#include "llvm/Support/ErrorHandling.h"
26#include "llvm/Support/TargetRegistry.h"
27
28#include "AVR.h"
29#include "AVRMachineFunctionInfo.h"
30#include "AVRTargetMachine.h"
31#include "MCTargetDesc/AVRMCTargetDesc.h"
32
33#define GET_INSTRINFO_CTOR_DTOR
34#include "AVRGenInstrInfo.inc"
35
36namespace llvm {
37
38AVRInstrInfo::AVRInstrInfo()
39 : AVRGenInstrInfo(AVR::ADJCALLSTACKDOWN, AVR::ADJCALLSTACKUP), RI() {}
40
41void AVRInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
42 MachineBasicBlock::iterator MI, DebugLoc DL,
43 unsigned DestReg, unsigned SrcReg,
44 bool KillSrc) const {
45 unsigned Opc;
46
47 if (AVR::GPR8RegClass.contains(DestReg, SrcReg)) {
48 Opc = AVR::MOVRdRr;
49 } else if (AVR::DREGSRegClass.contains(DestReg, SrcReg)) {
50 Opc = AVR::MOVWRdRr;
51 } else if (SrcReg == AVR::SP && AVR::DREGSRegClass.contains(DestReg)) {
52 Opc = AVR::SPREAD;
53 } else if (DestReg == AVR::SP && AVR::DREGSRegClass.contains(SrcReg)) {
54 Opc = AVR::SPWRITE;
55 } else {
56 llvm_unreachable("Impossible reg-to-reg copy");
57 }
58
59 BuildMI(MBB, MI, DL, get(Opc), DestReg)
60 .addReg(SrcReg, getKillRegState(KillSrc));
61}
62
63unsigned AVRInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
64 int &FrameIndex) const {
65 switch (MI->getOpcode()) {
66 case AVR::LDDRdPtrQ:
67 case AVR::LDDWRdYQ: { //:FIXME: remove this once PR13375 gets fixed
68 if ((MI->getOperand(1).isFI()) && (MI->getOperand(2).isImm()) &&
69 (MI->getOperand(2).getImm() == 0)) {
70 FrameIndex = MI->getOperand(1).getIndex();
71 return MI->getOperand(0).getReg();
72 }
73 break;
74 }
75 default:
76 break;
77 }
78
79 return 0;
80}
81
82unsigned AVRInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
83 int &FrameIndex) const {
84 switch (MI->getOpcode()) {
85 case AVR::STDPtrQRr:
86 case AVR::STDWPtrQRr: {
87 if ((MI->getOperand(0).isFI()) && (MI->getOperand(1).isImm()) &&
88 (MI->getOperand(1).getImm() == 0)) {
89 FrameIndex = MI->getOperand(0).getIndex();
90 return MI->getOperand(2).getReg();
91 }
92 break;
93 }
94 default:
95 break;
96 }
97
98 return 0;
99}
100
101void AVRInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
102 MachineBasicBlock::iterator MI,
103 unsigned SrcReg, bool isKill,
104 int FrameIndex,
105 const TargetRegisterClass *RC,
106 const TargetRegisterInfo *TRI) const {
107 MachineFunction &MF = *MBB.getParent();
108 AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
109
110 DebugLoc DL;
111 if (MI != MBB.end()) {
112 DL = MI->getDebugLoc();
113 }
114
115 const MachineFrameInfo &MFI = *MF.getFrameInfo();
116
117 MachineMemOperand *MMO = MF.getMachineMemOperand(
118 MachinePointerInfo::getFixedStack(MF, FrameIndex),
119 MachineMemOperand::MOStore, MFI.getObjectSize(FrameIndex),
120 MFI.getObjectAlignment(FrameIndex));
121
122 unsigned Opcode = 0;
123 if (RC->hasType(MVT::i8)) {
124 Opcode = AVR::STDPtrQRr;
125 } else if (RC->hasType(MVT::i16)) {
126 Opcode = AVR::STDWPtrQRr;
127 } else {
128 llvm_unreachable("Cannot store this register into a stack slot!");
129 }
130
131 BuildMI(MBB, MI, DL, get(Opcode))
132 .addFrameIndex(FrameIndex)
133 .addImm(0)
134 .addReg(SrcReg, getKillRegState(isKill))
135 .addMemOperand(MMO);
136}
137
138void AVRInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
139 MachineBasicBlock::iterator MI,
140 unsigned DestReg, int FrameIndex,
141 const TargetRegisterClass *RC,
142 const TargetRegisterInfo *TRI) const {
143 DebugLoc DL;
144 if (MI != MBB.end()) {
145 DL = MI->getDebugLoc();
146 }
147
148 MachineFunction &MF = *MBB.getParent();
149 const MachineFrameInfo &MFI = *MF.getFrameInfo();
150
151 MachineMemOperand *MMO = MF.getMachineMemOperand(
152 MachinePointerInfo::getFixedStack(MF, FrameIndex),
153 MachineMemOperand::MOLoad, MFI.getObjectSize(FrameIndex),
154 MFI.getObjectAlignment(FrameIndex));
155
156 unsigned Opcode = 0;
157 if (RC->hasType(MVT::i8)) {
158 Opcode = AVR::LDDRdPtrQ;
159 } else if (RC->hasType(MVT::i16)) {
160 // Opcode = AVR::LDDWRdPtrQ;
161 //:FIXME: remove this once PR13375 gets fixed
162 Opcode = AVR::LDDWRdYQ;
163 } else {
164 llvm_unreachable("Cannot load this register from a stack slot!");
165 }
166
167 BuildMI(MBB, MI, DL, get(Opcode), DestReg)
168 .addFrameIndex(FrameIndex)
169 .addImm(0)
170 .addMemOperand(MMO);
171}
172
173const MCInstrDesc &AVRInstrInfo::getBrCond(AVRCC::CondCodes CC) const {
174 switch (CC) {
175 default:
176 llvm_unreachable("Unknown condition code!");
177 case AVRCC::COND_EQ:
178 return get(AVR::BREQk);
179 case AVRCC::COND_NE:
180 return get(AVR::BRNEk);
181 case AVRCC::COND_GE:
182 return get(AVR::BRGEk);
183 case AVRCC::COND_LT:
184 return get(AVR::BRLTk);
185 case AVRCC::COND_SH:
186 return get(AVR::BRSHk);
187 case AVRCC::COND_LO:
188 return get(AVR::BRLOk);
189 case AVRCC::COND_MI:
190 return get(AVR::BRMIk);
191 case AVRCC::COND_PL:
192 return get(AVR::BRPLk);
193 }
194}
195
196AVRCC::CondCodes AVRInstrInfo::getCondFromBranchOpc(unsigned Opc) const {
197 switch (Opc) {
198 default:
199 return AVRCC::COND_INVALID;
200 case AVR::BREQk:
201 return AVRCC::COND_EQ;
202 case AVR::BRNEk:
203 return AVRCC::COND_NE;
204 case AVR::BRSHk:
205 return AVRCC::COND_SH;
206 case AVR::BRLOk:
207 return AVRCC::COND_LO;
208 case AVR::BRMIk:
209 return AVRCC::COND_MI;
210 case AVR::BRPLk:
211 return AVRCC::COND_PL;
212 case AVR::BRGEk:
213 return AVRCC::COND_GE;
214 case AVR::BRLTk:
215 return AVRCC::COND_LT;
216 }
217}
218
219AVRCC::CondCodes AVRInstrInfo::getOppositeCondition(AVRCC::CondCodes CC) const {
220 switch (CC) {
221 default:
222 llvm_unreachable("Invalid condition!");
223 case AVRCC::COND_EQ:
224 return AVRCC::COND_NE;
225 case AVRCC::COND_NE:
226 return AVRCC::COND_EQ;
227 case AVRCC::COND_SH:
228 return AVRCC::COND_LO;
229 case AVRCC::COND_LO:
230 return AVRCC::COND_SH;
231 case AVRCC::COND_GE:
232 return AVRCC::COND_LT;
233 case AVRCC::COND_LT:
234 return AVRCC::COND_GE;
235 case AVRCC::COND_MI:
236 return AVRCC::COND_PL;
237 case AVRCC::COND_PL:
238 return AVRCC::COND_MI;
239 }
240}
241
242bool AVRInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
243 MachineBasicBlock *&TBB,
244 MachineBasicBlock *&FBB,
245 SmallVectorImpl<MachineOperand> &Cond,
246 bool AllowModify) const {
247 // Start from the bottom of the block and work up, examining the
248 // terminator instructions.
249 MachineBasicBlock::iterator I = MBB.end();
250 MachineBasicBlock::iterator UnCondBrIter = MBB.end();
251
252 while (I != MBB.begin()) {
253 --I;
254 if (I->isDebugValue()) {
255 continue;
256 }
257
258 // Working from the bottom, when we see a non-terminator
259 // instruction, we're done.
260 if (!isUnpredicatedTerminator(*I)) {
261 break;
262 }
263
264 // A terminator that isn't a branch can't easily be handled
265 // by this analysis.
266 if (!I->getDesc().isBranch()) {
267 return true;
268 }
269
270 // Handle unconditional branches.
271 //:TODO: add here jmp
272 if (I->getOpcode() == AVR::RJMPk) {
273 UnCondBrIter = I;
274
275 if (!AllowModify) {
276 TBB = I->getOperand(0).getMBB();
277 continue;
278 }
279
280 // If the block has any instructions after a JMP, delete them.
281 while (std::next(I) != MBB.end()) {
282 std::next(I)->eraseFromParent();
283 }
284
285 Cond.clear();
286 FBB = 0;
287
288 // Delete the JMP if it's equivalent to a fall-through.
289 if (MBB.isLayoutSuccessor(I->getOperand(0).getMBB())) {
290 TBB = 0;
291 I->eraseFromParent();
292 I = MBB.end();
293 UnCondBrIter = MBB.end();
294 continue;
295 }
296
297 // TBB is used to indicate the unconditinal destination.
298 TBB = I->getOperand(0).getMBB();
299 continue;
300 }
301
302 // Handle conditional branches.
303 AVRCC::CondCodes BranchCode = getCondFromBranchOpc(I->getOpcode());
304 if (BranchCode == AVRCC::COND_INVALID) {
305 return true; // Can't handle indirect branch.
306 }
307
308 // Working from the bottom, handle the first conditional branch.
309 if (Cond.empty()) {
310 MachineBasicBlock *TargetBB = I->getOperand(0).getMBB();
311 if (AllowModify && UnCondBrIter != MBB.end() &&
312 MBB.isLayoutSuccessor(TargetBB)) {
313 // If we can modify the code and it ends in something like:
314 //
315 // jCC L1
316 // jmp L2
317 // L1:
318 // ...
319 // L2:
320 //
321 // Then we can change this to:
322 //
323 // jnCC L2
324 // L1:
325 // ...
326 // L2:
327 //
328 // Which is a bit more efficient.
329 // We conditionally jump to the fall-through block.
330 BranchCode = getOppositeCondition(BranchCode);
331 unsigned JNCC = getBrCond(BranchCode).getOpcode();
332 MachineBasicBlock::iterator OldInst = I;
333
334 BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(JNCC))
335 .addMBB(UnCondBrIter->getOperand(0).getMBB());
336 BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(AVR::RJMPk))
337 .addMBB(TargetBB);
338
339 OldInst->eraseFromParent();
340 UnCondBrIter->eraseFromParent();
341
342 // Restart the analysis.
343 UnCondBrIter = MBB.end();
344 I = MBB.end();
345 continue;
346 }
347
348 FBB = TBB;
349 TBB = I->getOperand(0).getMBB();
350 Cond.push_back(MachineOperand::CreateImm(BranchCode));
351 continue;
352 }
353
354 // Handle subsequent conditional branches. Only handle the case where all
355 // conditional branches branch to the same destination.
356 assert(Cond.size() == 1);
357 assert(TBB);
358
359 // Only handle the case where all conditional branches branch to
360 // the same destination.
361 if (TBB != I->getOperand(0).getMBB()) {
362 return true;
363 }
364
365 AVRCC::CondCodes OldBranchCode = (AVRCC::CondCodes)Cond[0].getImm();
366 // If the conditions are the same, we can leave them alone.
367 if (OldBranchCode == BranchCode) {
368 continue;
369 }
370
371 return true;
372 }
373
374 return false;
375}
376
377unsigned AVRInstrInfo::InsertBranch(MachineBasicBlock &MBB,
378 MachineBasicBlock *TBB,
379 MachineBasicBlock *FBB,
380 ArrayRef<MachineOperand> Cond,
381 DebugLoc DL) const {
382 // Shouldn't be a fall through.
383 assert(TBB && "InsertBranch must not be told to insert a fallthrough");
384 assert((Cond.size() == 1 || Cond.size() == 0) &&
385 "AVR branch conditions have one component!");
386
387 if (Cond.empty()) {
388 assert(!FBB && "Unconditional branch with multiple successors!");
389 BuildMI(&MBB, DL, get(AVR::RJMPk)).addMBB(TBB);
390 return 1;
391 }
392
393 // Conditional branch.
394 unsigned Count = 0;
395 AVRCC::CondCodes CC = (AVRCC::CondCodes)Cond[0].getImm();
396 BuildMI(&MBB, DL, getBrCond(CC)).addMBB(TBB);
397 ++Count;
398
399 if (FBB) {
400 // Two-way Conditional branch. Insert the second branch.
401 BuildMI(&MBB, DL, get(AVR::RJMPk)).addMBB(FBB);
402 ++Count;
403 }
404
405 return Count;
406}
407
408unsigned AVRInstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
409 MachineBasicBlock::iterator I = MBB.end();
410 unsigned Count = 0;
411
412 while (I != MBB.begin()) {
413 --I;
414 if (I->isDebugValue()) {
415 continue;
416 }
417 //:TODO: add here the missing jmp instructions once they are implemented
418 // like jmp, {e}ijmp, and other cond branches, ...
419 if (I->getOpcode() != AVR::RJMPk &&
420 getCondFromBranchOpc(I->getOpcode()) == AVRCC::COND_INVALID) {
421 break;
422 }
423
424 // Remove the branch.
425 I->eraseFromParent();
426 I = MBB.end();
427 ++Count;
428 }
429
430 return Count;
431}
432
433bool AVRInstrInfo::ReverseBranchCondition(
434 SmallVectorImpl<MachineOperand> &Cond) const {
435 assert(Cond.size() == 1 && "Invalid AVR branch condition!");
436
437 AVRCC::CondCodes CC = static_cast<AVRCC::CondCodes>(Cond[0].getImm());
438 Cond[0].setImm(getOppositeCondition(CC));
439
440 return false;
441}
442
443unsigned AVRInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
444 unsigned Opcode = MI->getOpcode();
445
446 switch (Opcode) {
447 // A regular instruction
448 default: {
449 const MCInstrDesc &Desc = get(Opcode);
450 return Desc.getSize();
451 }
452 case TargetOpcode::EH_LABEL:
453 case TargetOpcode::IMPLICIT_DEF:
454 case TargetOpcode::KILL:
455 case TargetOpcode::DBG_VALUE:
456 return 0;
457 case TargetOpcode::INLINEASM: {
458 const MachineFunction *MF = MI->getParent()->getParent();
459 const AVRTargetMachine &TM = static_cast<const AVRTargetMachine&>(MF->getTarget());
460 const TargetInstrInfo &TII = *TM.getSubtargetImpl()->getInstrInfo();
461 return TII.getInlineAsmLength(MI->getOperand(0).getSymbolName(),
462 *TM.getMCAsmInfo());
463 }
464 }
465}
466
467} // end of namespace llvm