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
644552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
6535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes// Branch Analysis
664552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
6735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
680bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakavoid MipsInstrInfo::AnalyzeCondBr(const MachineInstr *Inst, unsigned Opc,
690bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                  MachineBasicBlock *&BB,
700bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                  SmallVectorImpl<MachineOperand> &Cond) const {
716daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka  assert(getAnalyzableBrOpc(Opc) && "Not an analyzable branch");
7220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  int NumOp = Inst->getNumExplicitOperands();
73bb481f882093fb738d2bb15610c79364bada5496Jia Liu
7420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // for both int and fp branches, the last explicit operand is the
7520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // MBB.
7620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  BB = Inst->getOperand(NumOp-1).getMBB();
7720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  Cond.push_back(MachineOperand::CreateImm(Opc));
7820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka
7920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  for (int i=0; i<NumOp-1; i++)
8020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    Cond.push_back(Inst->getOperand(i));
8135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
8235d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
8381092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopesbool MipsInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
8435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes                                  MachineBasicBlock *&TBB,
8535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes                                  MachineBasicBlock *&FBB,
86dc54d317e7a381ef8e4aca80d54ad1466bb85ddaEvan Cheng                                  SmallVectorImpl<MachineOperand> &Cond,
87d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka                                  bool AllowModify) const {
88d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  SmallVector<MachineInstr*, 2> BranchInstrs;
89d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  BranchType BT = AnalyzeBranch(MBB, TBB, FBB, Cond, AllowModify, BranchInstrs);
9081092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
91d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  return (BT == BT_None) || (BT == BT_Indirect);
92bb481f882093fb738d2bb15610c79364bada5496Jia Liu}
93bb481f882093fb738d2bb15610c79364bada5496Jia Liu
9420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanakavoid MipsInstrInfo::BuildCondBr(MachineBasicBlock &MBB,
9520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka                                MachineBasicBlock *TBB, DebugLoc DL,
9620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka                                const SmallVectorImpl<MachineOperand>& Cond)
9720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  const {
9820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  unsigned Opc = Cond[0].getImm();
99e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  const MCInstrDesc &MCID = get(Opc);
100e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  MachineInstrBuilder MIB = BuildMI(&MBB, DL, MCID);
10181092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
102e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka  for (unsigned i = 1; i < Cond.size(); ++i) {
103e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka    if (Cond[i].isReg())
104e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka      MIB.addReg(Cond[i].getReg());
105e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka    else if (Cond[i].isImm())
106e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka      MIB.addImm(Cond[i].getImm());
107e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka    else
108e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka       assert(true && "Cannot copy operand");
109e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka  }
11020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MIB.addMBB(TBB);
11135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
11235d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
113972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesunsigned MipsInstrInfo::
11481092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesInsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
11544eb65cf58e3ab9b5621ce72256d1621a18aeed7Owen Anderson             MachineBasicBlock *FBB,
1163bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings             const SmallVectorImpl<MachineOperand> &Cond,
1173bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings             DebugLoc DL) const {
11835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  // Shouldn't be a fall through.
11935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  assert(TBB && "InsertBranch must not be told to insert a fallthrough");
12035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
12120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // # of condition operands:
12220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Unconditional branches: 0
12320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Floating point branches: 1 (opc)
12420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Int BranchZero: 2 (opc, reg)
12520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  //  Int Branch: 3 (opc, reg0, reg1)
12620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  assert((Cond.size() <= 3) &&
12720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka         "# of Mips branch conditions must be <= 3!");
12881092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
12935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  // Two-way Conditional branch.
13020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  if (FBB) {
13120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    BuildCondBr(MBB, TBB, DL, Cond);
1326e55ff56b88c3334d5847f2cb26f3001b92c489bAkira Hatanaka    BuildMI(&MBB, DL, get(UncondBrOpc)).addMBB(FBB);
13320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    return 2;
13420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  }
13535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
13620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // One way branch.
13720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Unconditional branch.
13820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  if (Cond.empty())
1396e55ff56b88c3334d5847f2cb26f3001b92c489bAkira Hatanaka    BuildMI(&MBB, DL, get(UncondBrOpc)).addMBB(TBB);
14020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  else // Conditional branch.
14120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    BuildCondBr(MBB, TBB, DL, Cond);
14220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  return 1;
143972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes}
14435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
14535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesunsigned MipsInstrInfo::
14681092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesRemoveBranch(MachineBasicBlock &MBB) const
14735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{
14820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MachineBasicBlock::reverse_iterator I = MBB.rbegin(), REnd = MBB.rend();
14920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MachineBasicBlock::reverse_iterator FirstBr;
15020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  unsigned removed;
15120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka
15220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Skip all the debug instructions.
15320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  while (I != REnd && I->isDebugValue())
15420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka    ++I;
15581092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
15620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  FirstBr = I;
15781092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
15820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Up to 2 branches are removed.
15920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  // Note that indirect branches are not removed.
16020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  for(removed = 0; I != REnd && removed < 2; ++I, ++removed)
1616daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka    if (!getAnalyzableBrOpc(I->getOpcode()))
16220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka      break;
16381092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
16420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  MBB.erase(I.base(), FirstBr.base());
16581092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes
16620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  return removed;
16735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
16835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes
16981092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes/// ReverseBranchCondition - Return the inverse opcode of the
17035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// specified Branch instruction.
17135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesbool MipsInstrInfo::
17281092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const
17335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{
17420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka  assert( (Cond.size() && Cond.size() <= 3) &&
17535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes          "Invalid Mips branch condition!");
1766daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka  Cond[0].setImm(getOppositeBranchOpc(Cond[0].getImm()));
17735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes  return false;
17835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes}
1799911405183f8596fe9d521467f83f6652a296cf4Dan Gohman
180d0a4b60df146b8c51555a752fed1530999ecbe64Akira HatanakaMipsInstrInfo::BranchType MipsInstrInfo::
181d0a4b60df146b8c51555a752fed1530999ecbe64Akira HatanakaAnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
182d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka              MachineBasicBlock *&FBB, SmallVectorImpl<MachineOperand> &Cond,
183d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka              bool AllowModify,
184d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka              SmallVectorImpl<MachineInstr*> &BranchInstrs) const {
185d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
186d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  MachineBasicBlock::reverse_iterator I = MBB.rbegin(), REnd = MBB.rend();
187d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
188d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Skip all the debug instructions.
189d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  while (I != REnd && I->isDebugValue())
190d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    ++I;
191d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
192d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (I == REnd || !isUnpredicatedTerminator(&*I)) {
193d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // This block ends with no branches (it just falls through to its succ).
194d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Leave TBB/FBB null.
195d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    TBB = FBB = NULL;
196d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_NoBranch;
197d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
198d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
199d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  MachineInstr *LastInst = &*I;
200d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  unsigned LastOpc = LastInst->getOpcode();
201d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  BranchInstrs.push_back(LastInst);
202d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
203d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Not an analyzable branch (e.g., indirect jump).
2046daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka  if (!getAnalyzableBrOpc(LastOpc))
205d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return LastInst->isIndirectBranch() ? BT_Indirect : BT_None;
206d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
207d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Get the second to last instruction in the block.
208d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  unsigned SecondLastOpc = 0;
209d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  MachineInstr *SecondLastInst = NULL;
210d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
211d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (++I != REnd) {
212d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    SecondLastInst = &*I;
2136daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka    SecondLastOpc = getAnalyzableBrOpc(SecondLastInst->getOpcode());
214d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
215d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Not an analyzable branch (must be an indirect jump).
216d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    if (isUnpredicatedTerminator(SecondLastInst) && !SecondLastOpc)
217d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      return BT_None;
218d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
219d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
220d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If there is only one terminator instruction, process it.
221d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (!SecondLastOpc) {
222d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Unconditional branch
223d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    if (LastOpc == UncondBrOpc) {
224d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      TBB = LastInst->getOperand(0).getMBB();
225d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      return BT_Uncond;
226d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    }
227d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
228d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Conditional branch
229d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    AnalyzeCondBr(LastInst, LastOpc, TBB, Cond);
230d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_Cond;
231d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
232d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
233d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If we reached here, there are two branches.
234d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If there are three terminators, we don't know what sort of block this is.
235d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (++I != REnd && isUnpredicatedTerminator(&*I))
236d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_None;
237d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
238888e8fefd22550ccfa496c3c1e02bd2ac036263bAkira Hatanaka  BranchInstrs.insert(BranchInstrs.begin(), SecondLastInst);
239888e8fefd22550ccfa496c3c1e02bd2ac036263bAkira Hatanaka
240d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // If second to last instruction is an unconditional branch,
241d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // analyze it and remove the last instruction.
242d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (SecondLastOpc == UncondBrOpc) {
243d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    // Return if the last instruction cannot be removed.
244d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    if (!AllowModify)
245d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka      return BT_None;
246d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
247d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    TBB = SecondLastInst->getOperand(0).getMBB();
248d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    LastInst->eraseFromParent();
249d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    BranchInstrs.pop_back();
250d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_Uncond;
251d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  }
252d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
253d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // Conditional branch followed by an unconditional branch.
254d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  // The last one must be unconditional.
255d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  if (LastOpc != UncondBrOpc)
256d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka    return BT_None;
257d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
258d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  AnalyzeCondBr(SecondLastInst, SecondLastOpc, TBB, Cond);
259d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  FBB = LastInst->getOperand(0).getMBB();
260d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
261d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka  return BT_CondUncond;
262d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka}
263d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka
264d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka/// Return the number of bytes of code the specified instruction may be.
265d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanakaunsigned MipsInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
266d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  switch (MI->getOpcode()) {
267d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  default:
268d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    return MI->getDesc().getSize();
269d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  case  TargetOpcode::INLINEASM: {       // Inline Asm: Variable size.
270d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    const MachineFunction *MF = MI->getParent()->getParent();
271d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    const char *AsmStr = MI->getOperand(0).getSymbolName();
272d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka    return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo());
273d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  }
274d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka  }
275d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka}
276151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka
277151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira HatanakaMachineInstrBuilder
278151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira HatanakaMipsInstrInfo::genInstrWithNewOpc(unsigned NewOpc,
279151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka                                  MachineBasicBlock::iterator I) const {
280151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka  MachineInstrBuilder MIB;
281151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka  MIB = BuildMI(*I->getParent(), I, I->getDebugLoc(), get(NewOpc));
282151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka
283151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka  for (unsigned J = 0, E = I->getDesc().getNumOperands(); J < E; ++J)
284151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka    MIB.addOperand(I->getOperand(J));
285151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka
286151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka  MIB.setMemRefs(I->memoperands_begin(), I->memoperands_end());
287151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka  return MIB;
288151687cb8c4fc65fefcd8964a0c3d77680e90a5cAkira Hatanaka}
289