- Rename TargetInstrDesc, TargetOperandInfo to MCInstrDesc and MCOperandInfo and
[oota-llvm.git] / lib / Target / ARM / Thumb2InstrInfo.cpp
1 //===- Thumb2InstrInfo.cpp - Thumb-2 Instruction Information ----*- C++ -*-===//
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 Thumb-2 implementation of the TargetInstrInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "Thumb2InstrInfo.h"
15 #include "ARM.h"
16 #include "ARMConstantPoolValue.h"
17 #include "ARMAddressingModes.h"
18 #include "ARMGenInstrInfo.inc"
19 #include "ARMMachineFunctionInfo.h"
20 #include "Thumb2InstrInfo.h"
21 #include "llvm/CodeGen/MachineFrameInfo.h"
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
23 #include "llvm/CodeGen/MachineMemOperand.h"
24 #include "llvm/CodeGen/PseudoSourceValue.h"
25 #include "llvm/ADT/SmallVector.h"
26 #include "llvm/Support/CommandLine.h"
27
28 using namespace llvm;
29
30 static cl::opt<bool>
31 OldT2IfCvt("old-thumb2-ifcvt", cl::Hidden,
32            cl::desc("Use old-style Thumb2 if-conversion heuristics"),
33            cl::init(false));
34
35 Thumb2InstrInfo::Thumb2InstrInfo(const ARMSubtarget &STI)
36   : ARMBaseInstrInfo(STI), RI(*this, STI) {
37 }
38
39 unsigned Thumb2InstrInfo::getUnindexedOpcode(unsigned Opc) const {
40   // FIXME
41   return 0;
42 }
43
44 void
45 Thumb2InstrInfo::ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail,
46                                          MachineBasicBlock *NewDest) const {
47   MachineBasicBlock *MBB = Tail->getParent();
48   ARMFunctionInfo *AFI = MBB->getParent()->getInfo<ARMFunctionInfo>();
49   if (!AFI->hasITBlocks()) {
50     TargetInstrInfoImpl::ReplaceTailWithBranchTo(Tail, NewDest);
51     return;
52   }
53
54   // If the first instruction of Tail is predicated, we may have to update
55   // the IT instruction.
56   unsigned PredReg = 0;
57   ARMCC::CondCodes CC = llvm::getInstrPredicate(Tail, PredReg);
58   MachineBasicBlock::iterator MBBI = Tail;
59   if (CC != ARMCC::AL)
60     // Expecting at least the t2IT instruction before it.
61     --MBBI;
62
63   // Actually replace the tail.
64   TargetInstrInfoImpl::ReplaceTailWithBranchTo(Tail, NewDest);
65
66   // Fix up IT.
67   if (CC != ARMCC::AL) {
68     MachineBasicBlock::iterator E = MBB->begin();
69     unsigned Count = 4; // At most 4 instructions in an IT block.
70     while (Count && MBBI != E) {
71       if (MBBI->isDebugValue()) {
72         --MBBI;
73         continue;
74       }
75       if (MBBI->getOpcode() == ARM::t2IT) {
76         unsigned Mask = MBBI->getOperand(1).getImm();
77         if (Count == 4)
78           MBBI->eraseFromParent();
79         else {
80           unsigned MaskOn = 1 << Count;
81           unsigned MaskOff = ~(MaskOn - 1);
82           MBBI->getOperand(1).setImm((Mask & MaskOff) | MaskOn);
83         }
84         return;
85       }
86       --MBBI;
87       --Count;
88     }
89
90     // Ctrl flow can reach here if branch folding is run before IT block
91     // formation pass.
92   }
93 }
94
95 bool
96 Thumb2InstrInfo::isLegalToSplitMBBAt(MachineBasicBlock &MBB,
97                                      MachineBasicBlock::iterator MBBI) const {
98   while (MBBI->isDebugValue()) {
99     ++MBBI;
100     if (MBBI == MBB.end())
101       return false;
102   }
103
104   unsigned PredReg = 0;
105   return llvm::getITInstrPredicate(MBBI, PredReg) == ARMCC::AL;
106 }
107
108 void Thumb2InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
109                                   MachineBasicBlock::iterator I, DebugLoc DL,
110                                   unsigned DestReg, unsigned SrcReg,
111                                   bool KillSrc) const {
112   // Handle SPR, DPR, and QPR copies.
113   if (!ARM::GPRRegClass.contains(DestReg, SrcReg))
114     return ARMBaseInstrInfo::copyPhysReg(MBB, I, DL, DestReg, SrcReg, KillSrc);
115
116   bool tDest = ARM::tGPRRegClass.contains(DestReg);
117   bool tSrc  = ARM::tGPRRegClass.contains(SrcReg);
118   unsigned Opc = ARM::tMOVgpr2gpr;
119   if (tDest && tSrc)
120     Opc = ARM::tMOVr;
121   else if (tSrc)
122     Opc = ARM::tMOVtgpr2gpr;
123   else if (tDest)
124     Opc = ARM::tMOVgpr2tgpr;
125
126   BuildMI(MBB, I, DL, get(Opc), DestReg)
127     .addReg(SrcReg, getKillRegState(KillSrc));
128 }
129
130 void Thumb2InstrInfo::
131 storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
132                     unsigned SrcReg, bool isKill, int FI,
133                     const TargetRegisterClass *RC,
134                     const TargetRegisterInfo *TRI) const {
135   if (RC == ARM::GPRRegisterClass   || RC == ARM::tGPRRegisterClass ||
136       RC == ARM::tcGPRRegisterClass || RC == ARM::rGPRRegisterClass) {
137     DebugLoc DL;
138     if (I != MBB.end()) DL = I->getDebugLoc();
139
140     MachineFunction &MF = *MBB.getParent();
141     MachineFrameInfo &MFI = *MF.getFrameInfo();
142     MachineMemOperand *MMO =
143       MF.getMachineMemOperand(
144                       MachinePointerInfo(PseudoSourceValue::getFixedStack(FI)),
145                               MachineMemOperand::MOStore,
146                               MFI.getObjectSize(FI),
147                               MFI.getObjectAlignment(FI));
148     AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::t2STRi12))
149                    .addReg(SrcReg, getKillRegState(isKill))
150                    .addFrameIndex(FI).addImm(0).addMemOperand(MMO));
151     return;
152   }
153
154   ARMBaseInstrInfo::storeRegToStackSlot(MBB, I, SrcReg, isKill, FI, RC, TRI);
155 }
156
157 void Thumb2InstrInfo::
158 loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
159                      unsigned DestReg, int FI,
160                      const TargetRegisterClass *RC,
161                      const TargetRegisterInfo *TRI) const {
162   if (RC == ARM::GPRRegisterClass   || RC == ARM::tGPRRegisterClass ||
163       RC == ARM::tcGPRRegisterClass || RC == ARM::rGPRRegisterClass) {
164     DebugLoc DL;
165     if (I != MBB.end()) DL = I->getDebugLoc();
166
167     MachineFunction &MF = *MBB.getParent();
168     MachineFrameInfo &MFI = *MF.getFrameInfo();
169     MachineMemOperand *MMO =
170       MF.getMachineMemOperand(
171                       MachinePointerInfo(PseudoSourceValue::getFixedStack(FI)),
172                               MachineMemOperand::MOLoad,
173                               MFI.getObjectSize(FI),
174                               MFI.getObjectAlignment(FI));
175     AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::t2LDRi12), DestReg)
176                    .addFrameIndex(FI).addImm(0).addMemOperand(MMO));
177     return;
178   }
179
180   ARMBaseInstrInfo::loadRegFromStackSlot(MBB, I, DestReg, FI, RC, TRI);
181 }
182
183 void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB,
184                                MachineBasicBlock::iterator &MBBI, DebugLoc dl,
185                                unsigned DestReg, unsigned BaseReg, int NumBytes,
186                                ARMCC::CondCodes Pred, unsigned PredReg,
187                                const ARMBaseInstrInfo &TII, unsigned MIFlags) {
188   bool isSub = NumBytes < 0;
189   if (isSub) NumBytes = -NumBytes;
190
191   // If profitable, use a movw or movt to materialize the offset.
192   // FIXME: Use the scavenger to grab a scratch register.
193   if (DestReg != ARM::SP && DestReg != BaseReg &&
194       NumBytes >= 4096 &&
195       ARM_AM::getT2SOImmVal(NumBytes) == -1) {
196     bool Fits = false;
197     if (NumBytes < 65536) {
198       // Use a movw to materialize the 16-bit constant.
199       BuildMI(MBB, MBBI, dl, TII.get(ARM::t2MOVi16), DestReg)
200         .addImm(NumBytes)
201         .addImm((unsigned)Pred).addReg(PredReg).setMIFlags(MIFlags);
202       Fits = true;
203     } else if ((NumBytes & 0xffff) == 0) {
204       // Use a movt to materialize the 32-bit constant.
205       BuildMI(MBB, MBBI, dl, TII.get(ARM::t2MOVTi16), DestReg)
206         .addReg(DestReg)
207         .addImm(NumBytes >> 16)
208         .addImm((unsigned)Pred).addReg(PredReg).setMIFlags(MIFlags);
209       Fits = true;
210     }
211
212     if (Fits) {
213       if (isSub) {
214         BuildMI(MBB, MBBI, dl, TII.get(ARM::t2SUBrr), DestReg)
215           .addReg(BaseReg, RegState::Kill)
216           .addReg(DestReg, RegState::Kill)
217           .addImm((unsigned)Pred).addReg(PredReg).addReg(0)
218           .setMIFlags(MIFlags);
219       } else {
220         BuildMI(MBB, MBBI, dl, TII.get(ARM::t2ADDrr), DestReg)
221           .addReg(DestReg, RegState::Kill)
222           .addReg(BaseReg, RegState::Kill)
223           .addImm((unsigned)Pred).addReg(PredReg).addReg(0)
224           .setMIFlags(MIFlags);
225       }
226       return;
227     }
228   }
229
230   while (NumBytes) {
231     unsigned ThisVal = NumBytes;
232     unsigned Opc = 0;
233     if (DestReg == ARM::SP && BaseReg != ARM::SP) {
234       // mov sp, rn. Note t2MOVr cannot be used.
235       BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVgpr2gpr),DestReg)
236         .addReg(BaseReg).setMIFlags(MIFlags);
237       BaseReg = ARM::SP;
238       continue;
239     }
240
241     bool HasCCOut = true;
242     if (BaseReg == ARM::SP) {
243       // sub sp, sp, #imm7
244       if (DestReg == ARM::SP && (ThisVal < ((1 << 7)-1) * 4)) {
245         assert((ThisVal & 3) == 0 && "Stack update is not multiple of 4?");
246         Opc = isSub ? ARM::tSUBspi : ARM::tADDspi;
247         // FIXME: Fix Thumb1 immediate encoding.
248         BuildMI(MBB, MBBI, dl, TII.get(Opc), DestReg)
249           .addReg(BaseReg).addImm(ThisVal/4).setMIFlags(MIFlags);
250         NumBytes = 0;
251         continue;
252       }
253
254       // sub rd, sp, so_imm
255       Opc = isSub ? ARM::t2SUBrSPi : ARM::t2ADDrSPi;
256       if (ARM_AM::getT2SOImmVal(NumBytes) != -1) {
257         NumBytes = 0;
258       } else {
259         // FIXME: Move this to ARMAddressingModes.h?
260         unsigned RotAmt = CountLeadingZeros_32(ThisVal);
261         ThisVal = ThisVal & ARM_AM::rotr32(0xff000000U, RotAmt);
262         NumBytes &= ~ThisVal;
263         assert(ARM_AM::getT2SOImmVal(ThisVal) != -1 &&
264                "Bit extraction didn't work?");
265       }
266     } else {
267       assert(DestReg != ARM::SP && BaseReg != ARM::SP);
268       Opc = isSub ? ARM::t2SUBri : ARM::t2ADDri;
269       if (ARM_AM::getT2SOImmVal(NumBytes) != -1) {
270         NumBytes = 0;
271       } else if (ThisVal < 4096) {
272         Opc = isSub ? ARM::t2SUBri12 : ARM::t2ADDri12;
273         HasCCOut = false;
274         NumBytes = 0;
275       } else {
276         // FIXME: Move this to ARMAddressingModes.h?
277         unsigned RotAmt = CountLeadingZeros_32(ThisVal);
278         ThisVal = ThisVal & ARM_AM::rotr32(0xff000000U, RotAmt);
279         NumBytes &= ~ThisVal;
280         assert(ARM_AM::getT2SOImmVal(ThisVal) != -1 &&
281                "Bit extraction didn't work?");
282       }
283     }
284
285     // Build the new ADD / SUB.
286     MachineInstrBuilder MIB =
287       AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(Opc), DestReg)
288                      .addReg(BaseReg, RegState::Kill)
289                      .addImm(ThisVal)).setMIFlags(MIFlags);
290     if (HasCCOut)
291       AddDefaultCC(MIB);
292
293     BaseReg = DestReg;
294   }
295 }
296
297 static unsigned
298 negativeOffsetOpcode(unsigned opcode)
299 {
300   switch (opcode) {
301   case ARM::t2LDRi12:   return ARM::t2LDRi8;
302   case ARM::t2LDRHi12:  return ARM::t2LDRHi8;
303   case ARM::t2LDRBi12:  return ARM::t2LDRBi8;
304   case ARM::t2LDRSHi12: return ARM::t2LDRSHi8;
305   case ARM::t2LDRSBi12: return ARM::t2LDRSBi8;
306   case ARM::t2STRi12:   return ARM::t2STRi8;
307   case ARM::t2STRBi12:  return ARM::t2STRBi8;
308   case ARM::t2STRHi12:  return ARM::t2STRHi8;
309
310   case ARM::t2LDRi8:
311   case ARM::t2LDRHi8:
312   case ARM::t2LDRBi8:
313   case ARM::t2LDRSHi8:
314   case ARM::t2LDRSBi8:
315   case ARM::t2STRi8:
316   case ARM::t2STRBi8:
317   case ARM::t2STRHi8:
318     return opcode;
319
320   default:
321     break;
322   }
323
324   return 0;
325 }
326
327 static unsigned
328 positiveOffsetOpcode(unsigned opcode)
329 {
330   switch (opcode) {
331   case ARM::t2LDRi8:   return ARM::t2LDRi12;
332   case ARM::t2LDRHi8:  return ARM::t2LDRHi12;
333   case ARM::t2LDRBi8:  return ARM::t2LDRBi12;
334   case ARM::t2LDRSHi8: return ARM::t2LDRSHi12;
335   case ARM::t2LDRSBi8: return ARM::t2LDRSBi12;
336   case ARM::t2STRi8:   return ARM::t2STRi12;
337   case ARM::t2STRBi8:  return ARM::t2STRBi12;
338   case ARM::t2STRHi8:  return ARM::t2STRHi12;
339
340   case ARM::t2LDRi12:
341   case ARM::t2LDRHi12:
342   case ARM::t2LDRBi12:
343   case ARM::t2LDRSHi12:
344   case ARM::t2LDRSBi12:
345   case ARM::t2STRi12:
346   case ARM::t2STRBi12:
347   case ARM::t2STRHi12:
348     return opcode;
349
350   default:
351     break;
352   }
353
354   return 0;
355 }
356
357 static unsigned
358 immediateOffsetOpcode(unsigned opcode)
359 {
360   switch (opcode) {
361   case ARM::t2LDRs:   return ARM::t2LDRi12;
362   case ARM::t2LDRHs:  return ARM::t2LDRHi12;
363   case ARM::t2LDRBs:  return ARM::t2LDRBi12;
364   case ARM::t2LDRSHs: return ARM::t2LDRSHi12;
365   case ARM::t2LDRSBs: return ARM::t2LDRSBi12;
366   case ARM::t2STRs:   return ARM::t2STRi12;
367   case ARM::t2STRBs:  return ARM::t2STRBi12;
368   case ARM::t2STRHs:  return ARM::t2STRHi12;
369
370   case ARM::t2LDRi12:
371   case ARM::t2LDRHi12:
372   case ARM::t2LDRBi12:
373   case ARM::t2LDRSHi12:
374   case ARM::t2LDRSBi12:
375   case ARM::t2STRi12:
376   case ARM::t2STRBi12:
377   case ARM::t2STRHi12:
378   case ARM::t2LDRi8:
379   case ARM::t2LDRHi8:
380   case ARM::t2LDRBi8:
381   case ARM::t2LDRSHi8:
382   case ARM::t2LDRSBi8:
383   case ARM::t2STRi8:
384   case ARM::t2STRBi8:
385   case ARM::t2STRHi8:
386     return opcode;
387
388   default:
389     break;
390   }
391
392   return 0;
393 }
394
395 bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
396                                unsigned FrameReg, int &Offset,
397                                const ARMBaseInstrInfo &TII) {
398   unsigned Opcode = MI.getOpcode();
399   const MCInstrDesc &Desc = MI.getDesc();
400   unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
401   bool isSub = false;
402
403   // Memory operands in inline assembly always use AddrModeT2_i12.
404   if (Opcode == ARM::INLINEASM)
405     AddrMode = ARMII::AddrModeT2_i12; // FIXME. mode for thumb2?
406
407   if (Opcode == ARM::t2ADDri || Opcode == ARM::t2ADDri12) {
408     Offset += MI.getOperand(FrameRegIdx+1).getImm();
409
410     unsigned PredReg;
411     if (Offset == 0 && getInstrPredicate(&MI, PredReg) == ARMCC::AL) {
412       // Turn it into a move.
413       MI.setDesc(TII.get(ARM::tMOVgpr2gpr));
414       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
415       // Remove offset and remaining explicit predicate operands.
416       do MI.RemoveOperand(FrameRegIdx+1);
417       while (MI.getNumOperands() > FrameRegIdx+1 &&
418              (!MI.getOperand(FrameRegIdx+1).isReg() ||
419               !MI.getOperand(FrameRegIdx+1).isImm()));
420       return true;
421     }
422
423     bool isSP = FrameReg == ARM::SP;
424     bool HasCCOut = Opcode != ARM::t2ADDri12;
425
426     if (Offset < 0) {
427       Offset = -Offset;
428       isSub = true;
429       MI.setDesc(TII.get(isSP ? ARM::t2SUBrSPi : ARM::t2SUBri));
430     } else {
431       MI.setDesc(TII.get(isSP ? ARM::t2ADDrSPi : ARM::t2ADDri));
432     }
433
434     // Common case: small offset, fits into instruction.
435     if (ARM_AM::getT2SOImmVal(Offset) != -1) {
436       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
437       MI.getOperand(FrameRegIdx+1).ChangeToImmediate(Offset);
438       // Add cc_out operand if the original instruction did not have one.
439       if (!HasCCOut)
440         MI.addOperand(MachineOperand::CreateReg(0, false));
441       Offset = 0;
442       return true;
443     }
444     // Another common case: imm12.
445     if (Offset < 4096 &&
446         (!HasCCOut || MI.getOperand(MI.getNumOperands()-1).getReg() == 0)) {
447       unsigned NewOpc = isSP
448         ? (isSub ? ARM::t2SUBrSPi12 : ARM::t2ADDrSPi12)
449         : (isSub ? ARM::t2SUBri12   : ARM::t2ADDri12);
450       MI.setDesc(TII.get(NewOpc));
451       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
452       MI.getOperand(FrameRegIdx+1).ChangeToImmediate(Offset);
453       // Remove the cc_out operand.
454       if (HasCCOut)
455         MI.RemoveOperand(MI.getNumOperands()-1);
456       Offset = 0;
457       return true;
458     }
459
460     // Otherwise, extract 8 adjacent bits from the immediate into this
461     // t2ADDri/t2SUBri.
462     unsigned RotAmt = CountLeadingZeros_32(Offset);
463     unsigned ThisImmVal = Offset & ARM_AM::rotr32(0xff000000U, RotAmt);
464
465     // We will handle these bits from offset, clear them.
466     Offset &= ~ThisImmVal;
467
468     assert(ARM_AM::getT2SOImmVal(ThisImmVal) != -1 &&
469            "Bit extraction didn't work?");
470     MI.getOperand(FrameRegIdx+1).ChangeToImmediate(ThisImmVal);
471     // Add cc_out operand if the original instruction did not have one.
472     if (!HasCCOut)
473       MI.addOperand(MachineOperand::CreateReg(0, false));
474
475   } else {
476
477     // AddrMode4 and AddrMode6 cannot handle any offset.
478     if (AddrMode == ARMII::AddrMode4 || AddrMode == ARMII::AddrMode6)
479       return false;
480
481     // AddrModeT2_so cannot handle any offset. If there is no offset
482     // register then we change to an immediate version.
483     unsigned NewOpc = Opcode;
484     if (AddrMode == ARMII::AddrModeT2_so) {
485       unsigned OffsetReg = MI.getOperand(FrameRegIdx+1).getReg();
486       if (OffsetReg != 0) {
487         MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
488         return Offset == 0;
489       }
490
491       MI.RemoveOperand(FrameRegIdx+1);
492       MI.getOperand(FrameRegIdx+1).ChangeToImmediate(0);
493       NewOpc = immediateOffsetOpcode(Opcode);
494       AddrMode = ARMII::AddrModeT2_i12;
495     }
496
497     unsigned NumBits = 0;
498     unsigned Scale = 1;
499     if (AddrMode == ARMII::AddrModeT2_i8 || AddrMode == ARMII::AddrModeT2_i12) {
500       // i8 supports only negative, and i12 supports only positive, so
501       // based on Offset sign convert Opcode to the appropriate
502       // instruction
503       Offset += MI.getOperand(FrameRegIdx+1).getImm();
504       if (Offset < 0) {
505         NewOpc = negativeOffsetOpcode(Opcode);
506         NumBits = 8;
507         isSub = true;
508         Offset = -Offset;
509       } else {
510         NewOpc = positiveOffsetOpcode(Opcode);
511         NumBits = 12;
512       }
513     } else if (AddrMode == ARMII::AddrMode5) {
514       // VFP address mode.
515       const MachineOperand &OffOp = MI.getOperand(FrameRegIdx+1);
516       int InstrOffs = ARM_AM::getAM5Offset(OffOp.getImm());
517       if (ARM_AM::getAM5Op(OffOp.getImm()) == ARM_AM::sub)
518         InstrOffs *= -1;
519       NumBits = 8;
520       Scale = 4;
521       Offset += InstrOffs * 4;
522       assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!");
523       if (Offset < 0) {
524         Offset = -Offset;
525         isSub = true;
526       }
527     } else {
528       llvm_unreachable("Unsupported addressing mode!");
529     }
530
531     if (NewOpc != Opcode)
532       MI.setDesc(TII.get(NewOpc));
533
534     MachineOperand &ImmOp = MI.getOperand(FrameRegIdx+1);
535
536     // Attempt to fold address computation
537     // Common case: small offset, fits into instruction.
538     int ImmedOffset = Offset / Scale;
539     unsigned Mask = (1 << NumBits) - 1;
540     if ((unsigned)Offset <= Mask * Scale) {
541       // Replace the FrameIndex with fp/sp
542       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
543       if (isSub) {
544         if (AddrMode == ARMII::AddrMode5)
545           // FIXME: Not consistent.
546           ImmedOffset |= 1 << NumBits;
547         else
548           ImmedOffset = -ImmedOffset;
549       }
550       ImmOp.ChangeToImmediate(ImmedOffset);
551       Offset = 0;
552       return true;
553     }
554
555     // Otherwise, offset doesn't fit. Pull in what we can to simplify
556     ImmedOffset = ImmedOffset & Mask;
557     if (isSub) {
558       if (AddrMode == ARMII::AddrMode5)
559         // FIXME: Not consistent.
560         ImmedOffset |= 1 << NumBits;
561       else {
562         ImmedOffset = -ImmedOffset;
563         if (ImmedOffset == 0)
564           // Change the opcode back if the encoded offset is zero.
565           MI.setDesc(TII.get(positiveOffsetOpcode(NewOpc)));
566       }
567     }
568     ImmOp.ChangeToImmediate(ImmedOffset);
569     Offset &= ~(Mask*Scale);
570   }
571
572   Offset = (isSub) ? -Offset : Offset;
573   return Offset == 0;
574 }
575
576 /// scheduleTwoAddrSource - Schedule the copy / re-mat of the source of the
577 /// two-addrss instruction inserted by two-address pass.
578 void
579 Thumb2InstrInfo::scheduleTwoAddrSource(MachineInstr *SrcMI,
580                                        MachineInstr *UseMI,
581                                        const TargetRegisterInfo &TRI) const {
582   if (SrcMI->getOpcode() != ARM::tMOVgpr2gpr ||
583       SrcMI->getOperand(1).isKill())
584     return;
585
586   unsigned PredReg = 0;
587   ARMCC::CondCodes CC = llvm::getInstrPredicate(UseMI, PredReg);
588   if (CC == ARMCC::AL || PredReg != ARM::CPSR)
589     return;
590
591   // Schedule the copy so it doesn't come between previous instructions
592   // and UseMI which can form an IT block.
593   unsigned SrcReg = SrcMI->getOperand(1).getReg();
594   ARMCC::CondCodes OCC = ARMCC::getOppositeCondition(CC);
595   MachineBasicBlock *MBB = UseMI->getParent();
596   MachineBasicBlock::iterator MBBI = SrcMI;
597   unsigned NumInsts = 0;
598   while (--MBBI != MBB->begin()) {
599     if (MBBI->isDebugValue())
600       continue;
601
602     MachineInstr *NMI = &*MBBI;
603     ARMCC::CondCodes NCC = llvm::getInstrPredicate(NMI, PredReg);
604     if (!(NCC == CC || NCC == OCC) ||
605         NMI->modifiesRegister(SrcReg, &TRI) ||
606         NMI->definesRegister(ARM::CPSR))
607       break;
608     if (++NumInsts == 4)
609       // Too many in a row!
610       return;
611   }
612
613   if (NumInsts) {
614     MBB->remove(SrcMI);
615     MBB->insert(++MBBI, SrcMI);
616   }
617 }
618
619 ARMCC::CondCodes
620 llvm::getITInstrPredicate(const MachineInstr *MI, unsigned &PredReg) {
621   unsigned Opc = MI->getOpcode();
622   if (Opc == ARM::tBcc || Opc == ARM::t2Bcc)
623     return ARMCC::AL;
624   return llvm::getInstrPredicate(MI, PredReg);
625 }