1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsInstrInfo.cpp - Mips Instruction Information ------------------===//
2972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
3972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
4972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
9972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
10972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// This file contains the Mips implementation of the TargetInstrInfo class.
11972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
13972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
14972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsInstrInfo.h"
15794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka#include "InstPrinter/MipsInstPrinter.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsAnalyzeImmediate.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsMachineFunction.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsTargetMachine.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h"
20972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineInstrBuilder.h"
219911405183f8596fe9d521467f83f6652a296cf4Dan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h"
22c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
233e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
2422fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng
254db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#define GET_INSTRINFO_CTOR
26972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsGenInstrInfo.inc"
27972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
28972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesusing namespace llvm;
29972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
300bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira HatanakaMipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm, unsigned UncondBr)
314db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng  : MipsGenInstrInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP),
328589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka    TM(tm), UncondBrOpc(UncondBr) {}
33794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka
34af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanakaconst MipsInstrInfo *MipsInstrInfo::create(MipsTargetMachine &TM) {
35af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka  if (TM.getSubtargetImpl()->inMips16Mode())
36af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka    return llvm::createMips16InstrInfo(TM);
37af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka
38af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka  return llvm::createMipsSEInstrInfo(TM);
39af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka}
40af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka
410bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakabool MipsInstrInfo::isZeroImm(const MachineOperand &op) const {
42d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  return op.isImm() && op.getImm() == 0;
43972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes}
44972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
4535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// insertNoop - If data hazard condition is found insert the target nop
4635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// instruction.
4735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesvoid MipsInstrInfo::
4881092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesinsertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
4935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{
50c7f3ace20c325521c68335a1689645b43b06ddf0Chris Lattner  DebugLoc DL;
51d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  BuildMI(MBB, MI, DL, get(Mips::NOP));
5235d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
5335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
540bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira HatanakaMachineMemOperand *MipsInstrInfo::GetMemOperand(MachineBasicBlock &MBB, int FI,
550bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                                unsigned Flag) const {
56fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka  MachineFunction &MF = *MBB.getParent();
57fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka  MachineFrameInfo &MFI = *MF.getFrameInfo();
58fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka  unsigned Align = MFI.getObjectAlignment(FI);
59bb481f882093fb738d2bb15610c79364bada5496Jia Liu
60fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka  return MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(FI), Flag,
61fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka                                 MFI.getObjectSize(FI), Align);
62fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka}
63fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka
64c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira HatanakaMachineInstr*
65c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira HatanakaMipsInstrInfo::emitFrameIndexDebugValue(MachineFunction &MF, int FrameIx,
66c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka                                        uint64_t Offset, const MDNode *MDPtr,
67c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka                                        DebugLoc DL) const {
68c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka  MachineInstrBuilder MIB = BuildMI(MF, DL, get(Mips::DBG_VALUE))
69c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka    .addFrameIndex(FrameIx).addImm(0).addImm(Offset).addMetadata(MDPtr);
70c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka  return &*MIB;
71c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka}
72c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka
734552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
7435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes// Branch Analysis
754552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
7635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
770bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakavoid MipsInstrInfo::AnalyzeCondBr(const MachineInstr *Inst, unsigned Opc,
780bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                  MachineBasicBlock *&BB,
790bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                  SmallVectorImpl<MachineOperand> &Cond) const {
8020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  assert(GetAnalyzableBrOpc(Opc) && "Not an analyzable branch");
8120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  int NumOp = Inst->getNumExplicitOperands();
82bb481f882093fb738d2bb15610c79364bada5496Jia Liu
8320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // for both int and fp branches, the last explicit operand is the
8420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // MBB.
8520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  BB = Inst->getOperand(NumOp-1).getMBB();
8620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  Cond.push_back(MachineOperand::CreateImm(Opc));
8720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka
8820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  for (int i=0; i<NumOp-1; i++)
8920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    Cond.push_back(Inst->getOperand(i));
9035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
9135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
9281092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopesbool MipsInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
9335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes                                  MachineBasicBlock *&TBB,
9435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes                                  MachineBasicBlock *&FBB,
95dc54d317e7a381ef8e4aca80d54ad1466bb85ddaEvan Cheng                                  SmallVectorImpl<MachineOperand> &Cond,
96d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka                                  bool AllowModify) const {
97d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  SmallVector<MachineInstr*, 2> BranchInstrs;
98d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  BranchType BT = AnalyzeBranch(MBB, TBB, FBB, Cond, AllowModify, BranchInstrs);
9981092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
100d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  return (BT == BT_None) || (BT == BT_Indirect);
101bb481f882093fb738d2bb15610c79364bada5496Jia Liu}
102bb481f882093fb738d2bb15610c79364bada5496Jia Liu
10320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanakavoid MipsInstrInfo::BuildCondBr(MachineBasicBlock &MBB,
10420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka                                MachineBasicBlock *TBB, DebugLoc DL,
10520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka                                const SmallVectorImpl<MachineOperand>& Cond)
10620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  const {
10720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  unsigned Opc = Cond[0].getImm();
108e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  const MCInstrDesc &MCID = get(Opc);
109e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  MachineInstrBuilder MIB = BuildMI(&MBB, DL, MCID);
11081092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
111e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka  for (unsigned i = 1; i < Cond.size(); ++i) {
112e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka    if (Cond[i].isReg())
113e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka      MIB.addReg(Cond[i].getReg());
114e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka    else if (Cond[i].isImm())
115e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka      MIB.addImm(Cond[i].getImm());
116e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka    else
117e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka       assert(true && "Cannot copy operand");
118e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka  }
11920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MIB.addMBB(TBB);
12035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
12135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
122972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesunsigned MipsInstrInfo::
12381092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesInsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
12444eb65cf58e3ab9b5621ce72256d1621a18aeed7Owen Anderson             MachineBasicBlock *FBB,
1253bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings             const SmallVectorImpl<MachineOperand> &Cond,
1263bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings             DebugLoc DL) const {
12735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  // Shouldn't be a fall through.
12835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  assert(TBB && "InsertBranch must not be told to insert a fallthrough");
12935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
13020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // # of condition operands:
13120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Unconditional branches: 0
13220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Floating point branches: 1 (opc)
13320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Int BranchZero: 2 (opc, reg)
13420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Int Branch: 3 (opc, reg0, reg1)
13520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  assert((Cond.size() <= 3) &&
13620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka         "# of Mips branch conditions must be <= 3!");
13781092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
13835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  // Two-way Conditional branch.
13920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  if (FBB) {
14020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    BuildCondBr(MBB, TBB, DL, Cond);
1416e55ff56b88c3334d5847f2cb26f3001b92c489bAkira Hatanaka    BuildMI(&MBB, DL, get(UncondBrOpc)).addMBB(FBB);
14220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    return 2;
14320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  }
14435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
14520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // One way branch.
14620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Unconditional branch.
14720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  if (Cond.empty())
1486e55ff56b88c3334d5847f2cb26f3001b92c489bAkira Hatanaka    BuildMI(&MBB, DL, get(UncondBrOpc)).addMBB(TBB);
14920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  else // Conditional branch.
15020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    BuildCondBr(MBB, TBB, DL, Cond);
15120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  return 1;
152972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes}
15335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
15435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesunsigned MipsInstrInfo::
15581092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesRemoveBranch(MachineBasicBlock &MBB) const
15635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{
15720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MachineBasicBlock::reverse_iterator I = MBB.rbegin(), REnd = MBB.rend();
15820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MachineBasicBlock::reverse_iterator FirstBr;
15920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  unsigned removed;
16020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka
16120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Skip all the debug instructions.
16220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  while (I != REnd && I->isDebugValue())
16320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    ++I;
16481092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
16520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  FirstBr = I;
16681092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
16720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Up to 2 branches are removed.
16820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Note that indirect branches are not removed.
16920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  for(removed = 0; I != REnd && removed < 2; ++I, ++removed)
17020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    if (!GetAnalyzableBrOpc(I->getOpcode()))
17120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka      break;
17281092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
17320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MBB.erase(I.base(), FirstBr.base());
17481092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
17520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  return removed;
17635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
17735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
17881092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes/// ReverseBranchCondition - Return the inverse opcode of the
17935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// specified Branch instruction.
18035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesbool MipsInstrInfo::
18181092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const
18235d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{
18320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  assert( (Cond.size() && Cond.size() <= 3) &&
18435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes          "Invalid Mips branch condition!");
1850bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  Cond[0].setImm(GetOppositeBranchOpc(Cond[0].getImm()));
18635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  return false;
18735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
1889911405183f8596fe9d521467f83f6652a296cf4Dan Gohman
189d0a4b60df146b8c51555a752fed1530999ecbe64Akira HatanakaMipsInstrInfo::BranchType MipsInstrInfo::
190d0a4b60df146b8c51555a752fed1530999ecbe64Akira HatanakaAnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
191d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka              MachineBasicBlock *&FBB, SmallVectorImpl<MachineOperand> &Cond,
192d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka              bool AllowModify,
193d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka              SmallVectorImpl<MachineInstr*> &BranchInstrs) const {
194d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
195d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  MachineBasicBlock::reverse_iterator I = MBB.rbegin(), REnd = MBB.rend();
196d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
197d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Skip all the debug instructions.
198d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  while (I != REnd && I->isDebugValue())
199d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    ++I;
200d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
201d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (I == REnd || !isUnpredicatedTerminator(&*I)) {
202d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // This block ends with no branches (it just falls through to its succ).
203d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Leave TBB/FBB null.
204d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    TBB = FBB = NULL;
205d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_NoBranch;
206d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
207d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
208d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  MachineInstr *LastInst = &*I;
209d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  unsigned LastOpc = LastInst->getOpcode();
210d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  BranchInstrs.push_back(LastInst);
211d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
212d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Not an analyzable branch (e.g., indirect jump).
213d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (!GetAnalyzableBrOpc(LastOpc))
214d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return LastInst->isIndirectBranch() ? BT_Indirect : BT_None;
215d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
216d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Get the second to last instruction in the block.
217d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  unsigned SecondLastOpc = 0;
218d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  MachineInstr *SecondLastInst = NULL;
219d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
220d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (++I != REnd) {
221d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    SecondLastInst = &*I;
222d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    SecondLastOpc = GetAnalyzableBrOpc(SecondLastInst->getOpcode());
223d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
224d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Not an analyzable branch (must be an indirect jump).
225d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    if (isUnpredicatedTerminator(SecondLastInst) && !SecondLastOpc)
226d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      return BT_None;
227d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
228d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
229d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If there is only one terminator instruction, process it.
230d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (!SecondLastOpc) {
231d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Unconditional branch
232d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    if (LastOpc == UncondBrOpc) {
233d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      TBB = LastInst->getOperand(0).getMBB();
234d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      return BT_Uncond;
235d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    }
236d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
237d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Conditional branch
238d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    AnalyzeCondBr(LastInst, LastOpc, TBB, Cond);
239d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_Cond;
240d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
241d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
242d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If we reached here, there are two branches.
243d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If there are three terminators, we don't know what sort of block this is.
244d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (++I != REnd && isUnpredicatedTerminator(&*I))
245d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_None;
246d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
247888e8fefd22550ccfa496c3c1e02bd2ac036263bAkira Hatanaka  BranchInstrs.insert(BranchInstrs.begin(), SecondLastInst);
248888e8fefd22550ccfa496c3c1e02bd2ac036263bAkira Hatanaka
249d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If second to last instruction is an unconditional branch,
250d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // analyze it and remove the last instruction.
251d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (SecondLastOpc == UncondBrOpc) {
252d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Return if the last instruction cannot be removed.
253d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    if (!AllowModify)
254d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      return BT_None;
255d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
256d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    TBB = SecondLastInst->getOperand(0).getMBB();
257d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    LastInst->eraseFromParent();
258d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    BranchInstrs.pop_back();
259d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_Uncond;
260d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
261d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
262d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Conditional branch followed by an unconditional branch.
263d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // The last one must be unconditional.
264d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (LastOpc != UncondBrOpc)
265d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_None;
266d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
267d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  AnalyzeCondBr(SecondLastInst, SecondLastOpc, TBB, Cond);
268d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  FBB = LastInst->getOperand(0).getMBB();
269d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
270d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  return BT_CondUncond;
271d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka}
272d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
273d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka/// Return the number of bytes of code the specified instruction may be.
274d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanakaunsigned MipsInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
275d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  switch (MI->getOpcode()) {
276d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  default:
277d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    return MI->getDesc().getSize();
278d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  case  TargetOpcode::INLINEASM: {       // Inline Asm: Variable size.
279d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    const MachineFunction *MF = MI->getParent()->getParent();
280d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    const char *AsmStr = MI->getOperand(0).getSymbolName();
281d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo());
282d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  }
283d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  }
284d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka}
285