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