MipsInstrInfo.cpp revision d735b8019b0f297d7c14b55adcd887af24d8e602
1//===- MipsInstrInfo.cpp - Mips 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 Mips implementation of the TargetInstrInfo class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "MipsInstrInfo.h" 15#include "MipsTargetMachine.h" 16#include "llvm/ADT/STLExtras.h" 17#include "llvm/CodeGen/MachineInstrBuilder.h" 18#include "MipsGenInstrInfo.inc" 19 20using namespace llvm; 21 22MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm) 23 : TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts)), 24 TM(tm), RI(*TM.getSubtargetImpl(), *this) {} 25 26static bool isZeroImm(const MachineOperand &op) { 27 return op.isImm() && op.getImm() == 0; 28} 29 30/// Return true if the instruction is a register to register move and 31/// leave the source and dest operands in the passed parameters. 32bool MipsInstrInfo:: 33isMoveInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg) const 34{ 35 // addu $dst, $src, $zero || addu $dst, $zero, $src 36 // or $dst, $src, $zero || or $dst, $zero, $src 37 if ((MI.getOpcode() == Mips::ADDu) || (MI.getOpcode() == Mips::OR)) { 38 if (MI.getOperand(1).getReg() == Mips::ZERO) { 39 DstReg = MI.getOperand(0).getReg(); 40 SrcReg = MI.getOperand(2).getReg(); 41 return true; 42 } else if (MI.getOperand(2).getReg() == Mips::ZERO) { 43 DstReg = MI.getOperand(0).getReg(); 44 SrcReg = MI.getOperand(1).getReg(); 45 return true; 46 } 47 } 48 49 // mov $fpDst, $fpSrc 50 // mfc $gpDst, $fpSrc 51 // mtc $fpDst, $gpSrc 52 if (MI.getOpcode() == Mips::FMOV_SO32 || MI.getOpcode() == Mips::FMOV_AS32 || 53 MI.getOpcode() == Mips::FMOV_D32 || MI.getOpcode() == Mips::MFC1A || 54 MI.getOpcode() == Mips::MFC1 || MI.getOpcode() == Mips::MTC1A || 55 MI.getOpcode() == Mips::MTC1 ) { 56 DstReg = MI.getOperand(0).getReg(); 57 SrcReg = MI.getOperand(1).getReg(); 58 return true; 59 } 60 61 // addiu $dst, $src, 0 62 if (MI.getOpcode() == Mips::ADDiu) { 63 if ((MI.getOperand(1).isReg()) && (isZeroImm(MI.getOperand(2)))) { 64 DstReg = MI.getOperand(0).getReg(); 65 SrcReg = MI.getOperand(1).getReg(); 66 return true; 67 } 68 } 69 return false; 70} 71 72/// isLoadFromStackSlot - If the specified machine instruction is a direct 73/// load from a stack slot, return the virtual or physical register number of 74/// the destination along with the FrameIndex of the loaded stack slot. If 75/// not, return 0. This predicate must return 0 if the instruction has 76/// any side effects other than loading from the stack slot. 77unsigned MipsInstrInfo:: 78isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const 79{ 80 if ((MI->getOpcode() == Mips::LW) || (MI->getOpcode() == Mips::LWC1) || 81 (MI->getOpcode() == Mips::LWC1A) || (MI->getOpcode() == Mips::LDC1)) { 82 if ((MI->getOperand(2).isFI()) && // is a stack slot 83 (MI->getOperand(1).isImm()) && // the imm is zero 84 (isZeroImm(MI->getOperand(1)))) { 85 FrameIndex = MI->getOperand(2).getIndex(); 86 return MI->getOperand(0).getReg(); 87 } 88 } 89 90 return 0; 91} 92 93/// isStoreToStackSlot - If the specified machine instruction is a direct 94/// store to a stack slot, return the virtual or physical register number of 95/// the source reg along with the FrameIndex of the loaded stack slot. If 96/// not, return 0. This predicate must return 0 if the instruction has 97/// any side effects other than storing to the stack slot. 98unsigned MipsInstrInfo:: 99isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const 100{ 101 if ((MI->getOpcode() == Mips::SW) || (MI->getOpcode() == Mips::SWC1) || 102 (MI->getOpcode() == Mips::SWC1A) || (MI->getOpcode() == Mips::SDC1)) { 103 if ((MI->getOperand(2).isFI()) && // is a stack slot 104 (MI->getOperand(1).isImm()) && // the imm is zero 105 (isZeroImm(MI->getOperand(1)))) { 106 FrameIndex = MI->getOperand(2).getIndex(); 107 return MI->getOperand(0).getReg(); 108 } 109 } 110 return 0; 111} 112 113/// insertNoop - If data hazard condition is found insert the target nop 114/// instruction. 115void MipsInstrInfo:: 116insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const 117{ 118 BuildMI(MBB, MI, get(Mips::NOP)); 119} 120 121bool MipsInstrInfo:: 122copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 123 unsigned DestReg, unsigned SrcReg, 124 const TargetRegisterClass *DestRC, 125 const TargetRegisterClass *SrcRC) const { 126 if (DestRC != SrcRC) { 127 if ((DestRC == Mips::CPURegsRegisterClass) && 128 (SrcRC == Mips::FGR32RegisterClass)) 129 BuildMI(MBB, I, get(Mips::MFC1), DestReg).addReg(SrcReg); 130 else if ((DestRC == Mips::CPURegsRegisterClass) && 131 (SrcRC == Mips::AFGR32RegisterClass)) 132 BuildMI(MBB, I, get(Mips::MFC1A), DestReg).addReg(SrcReg); 133 else if ((DestRC == Mips::FGR32RegisterClass) && 134 (SrcRC == Mips::CPURegsRegisterClass)) 135 BuildMI(MBB, I, get(Mips::MTC1), DestReg).addReg(SrcReg); 136 else if ((DestRC == Mips::AFGR32RegisterClass) && 137 (SrcRC == Mips::CPURegsRegisterClass)) 138 BuildMI(MBB, I, get(Mips::MTC1A), DestReg).addReg(SrcReg); 139 else if ((DestRC == Mips::AFGR32RegisterClass) && 140 (SrcRC == Mips::CPURegsRegisterClass)) 141 BuildMI(MBB, I, get(Mips::MTC1A), DestReg).addReg(SrcReg); 142 else if ((SrcRC == Mips::CCRRegisterClass) && 143 (SrcReg == Mips::FCR31)) 144 return true; // This register is used implicitly, no copy needed. 145 else if ((DestRC == Mips::CCRRegisterClass) && 146 (DestReg == Mips::FCR31)) 147 return true; // This register is used implicitly, no copy needed. 148 else if ((DestRC == Mips::HILORegisterClass) && 149 (SrcRC == Mips::CPURegsRegisterClass)) { 150 unsigned Opc = (DestReg == Mips::HI) ? Mips::MTHI : Mips::MTLO; 151 BuildMI(MBB, I, get(Opc), DestReg); 152 } else if ((SrcRC == Mips::HILORegisterClass) && 153 (DestRC == Mips::CPURegsRegisterClass)) { 154 unsigned Opc = (SrcReg == Mips::HI) ? Mips::MFHI : Mips::MFLO; 155 BuildMI(MBB, I, get(Opc), DestReg); 156 } else 157 // DestRC != SrcRC, Can't copy this register 158 return false; 159 160 return true; 161 } 162 163 if (DestRC == Mips::CPURegsRegisterClass) 164 BuildMI(MBB, I, get(Mips::ADDu), DestReg).addReg(Mips::ZERO) 165 .addReg(SrcReg); 166 else if (DestRC == Mips::FGR32RegisterClass) 167 BuildMI(MBB, I, get(Mips::FMOV_SO32), DestReg).addReg(SrcReg); 168 else if (DestRC == Mips::AFGR32RegisterClass) 169 BuildMI(MBB, I, get(Mips::FMOV_AS32), DestReg).addReg(SrcReg); 170 else if (DestRC == Mips::AFGR64RegisterClass) 171 BuildMI(MBB, I, get(Mips::FMOV_D32), DestReg).addReg(SrcReg); 172 else 173 // Can't copy this register 174 return false; 175 176 return true; 177} 178 179void MipsInstrInfo:: 180storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 181 unsigned SrcReg, bool isKill, int FI, 182 const TargetRegisterClass *RC) const 183{ 184 unsigned Opc; 185 if (RC == Mips::CPURegsRegisterClass) 186 Opc = Mips::SW; 187 else if (RC == Mips::FGR32RegisterClass) 188 Opc = Mips::SWC1; 189 else if (RC == Mips::AFGR32RegisterClass) 190 Opc = Mips::SWC1A; 191 else if (RC == Mips::AFGR64RegisterClass) 192 Opc = Mips::SDC1; 193 else 194 assert(0 && "Can't store this register to stack slot"); 195 196 BuildMI(MBB, I, get(Opc)).addReg(SrcReg, false, false, isKill) 197 .addImm(0).addFrameIndex(FI); 198} 199 200void MipsInstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg, 201 bool isKill, SmallVectorImpl<MachineOperand> &Addr, 202 const TargetRegisterClass *RC, SmallVectorImpl<MachineInstr*> &NewMIs) const 203{ 204 unsigned Opc; 205 if (RC == Mips::CPURegsRegisterClass) 206 Opc = Mips::SW; 207 else if (RC == Mips::FGR32RegisterClass) 208 Opc = Mips::SWC1; 209 else if (RC == Mips::AFGR32RegisterClass) 210 Opc = Mips::SWC1A; 211 else if (RC == Mips::AFGR64RegisterClass) 212 Opc = Mips::SDC1; 213 else 214 assert(0 && "Can't store this register"); 215 216 MachineInstrBuilder MIB = BuildMI(MF, get(Opc)) 217 .addReg(SrcReg, false, false, isKill); 218 for (unsigned i = 0, e = Addr.size(); i != e; ++i) { 219 MachineOperand &MO = Addr[i]; 220 if (MO.isReg()) 221 MIB.addReg(MO.getReg()); 222 else if (MO.isImm()) 223 MIB.addImm(MO.getImm()); 224 else 225 MIB.addFrameIndex(MO.getIndex()); 226 } 227 NewMIs.push_back(MIB); 228 return; 229} 230 231void MipsInstrInfo:: 232loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 233 unsigned DestReg, int FI, 234 const TargetRegisterClass *RC) const 235{ 236 unsigned Opc; 237 if (RC == Mips::CPURegsRegisterClass) 238 Opc = Mips::LW; 239 else if (RC == Mips::FGR32RegisterClass) 240 Opc = Mips::LWC1; 241 else if (RC == Mips::AFGR32RegisterClass) 242 Opc = Mips::LWC1A; 243 else if (RC == Mips::AFGR64RegisterClass) 244 Opc = Mips::LDC1; 245 else 246 assert(0 && "Can't load this register from stack slot"); 247 248 BuildMI(MBB, I, get(Opc), DestReg).addImm(0).addFrameIndex(FI); 249} 250 251void MipsInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg, 252 SmallVectorImpl<MachineOperand> &Addr, 253 const TargetRegisterClass *RC, 254 SmallVectorImpl<MachineInstr*> &NewMIs) const { 255 unsigned Opc; 256 if (RC == Mips::CPURegsRegisterClass) 257 Opc = Mips::LW; 258 else if (RC == Mips::FGR32RegisterClass) 259 Opc = Mips::LWC1; 260 else if (RC == Mips::AFGR32RegisterClass) 261 Opc = Mips::LWC1A; 262 else if (RC == Mips::AFGR64RegisterClass) 263 Opc = Mips::LDC1; 264 else 265 assert(0 && "Can't load this register"); 266 267 MachineInstrBuilder MIB = BuildMI(MF, get(Opc), DestReg); 268 for (unsigned i = 0, e = Addr.size(); i != e; ++i) { 269 MachineOperand &MO = Addr[i]; 270 if (MO.isReg()) 271 MIB.addReg(MO.getReg()); 272 else if (MO.isImm()) 273 MIB.addImm(MO.getImm()); 274 else 275 MIB.addFrameIndex(MO.getIndex()); 276 } 277 NewMIs.push_back(MIB); 278 return; 279} 280 281MachineInstr *MipsInstrInfo:: 282foldMemoryOperand(MachineFunction &MF, 283 MachineInstr* MI, 284 SmallVectorImpl<unsigned> &Ops, int FI) const 285{ 286 if (Ops.size() != 1) return NULL; 287 288 MachineInstr *NewMI = NULL; 289 290 switch (MI->getOpcode()) { 291 case Mips::ADDu: 292 if ((MI->getOperand(0).isReg()) && 293 (MI->getOperand(1).isReg()) && 294 (MI->getOperand(1).getReg() == Mips::ZERO) && 295 (MI->getOperand(2).isReg())) { 296 if (Ops[0] == 0) { // COPY -> STORE 297 unsigned SrcReg = MI->getOperand(2).getReg(); 298 bool isKill = MI->getOperand(2).isKill(); 299 NewMI = BuildMI(MF, get(Mips::SW)).addReg(SrcReg, false, false, isKill) 300 .addImm(0).addFrameIndex(FI); 301 } else { // COPY -> LOAD 302 unsigned DstReg = MI->getOperand(0).getReg(); 303 bool isDead = MI->getOperand(0).isDead(); 304 NewMI = BuildMI(MF, get(Mips::LW)) 305 .addReg(DstReg, true, false, false, isDead) 306 .addImm(0).addFrameIndex(FI); 307 } 308 } 309 break; 310 case Mips::FMOV_SO32: 311 case Mips::FMOV_AS32: 312 case Mips::FMOV_D32: 313 if ((MI->getOperand(0).isReg()) && 314 (MI->getOperand(1).isReg())) { 315 const TargetRegisterClass 316 *RC = RI.getRegClass(MI->getOperand(0).getReg()); 317 unsigned StoreOpc, LoadOpc; 318 319 if (RC == Mips::FGR32RegisterClass) { 320 LoadOpc = Mips::LWC1; StoreOpc = Mips::SWC1; 321 } else if (RC == Mips::AFGR32RegisterClass) { 322 LoadOpc = Mips::LWC1A; StoreOpc = Mips::SWC1A; 323 } else if (RC == Mips::AFGR64RegisterClass) { 324 LoadOpc = Mips::LDC1; StoreOpc = Mips::SDC1; 325 } else 326 assert(0 && "foldMemoryOperand register unknown"); 327 328 if (Ops[0] == 0) { // COPY -> STORE 329 unsigned SrcReg = MI->getOperand(1).getReg(); 330 bool isKill = MI->getOperand(1).isKill(); 331 NewMI = BuildMI(MF, get(StoreOpc)).addReg(SrcReg, false, false, isKill) 332 .addImm(0).addFrameIndex(FI) ; 333 } else { // COPY -> LOAD 334 unsigned DstReg = MI->getOperand(0).getReg(); 335 bool isDead = MI->getOperand(0).isDead(); 336 NewMI = BuildMI(MF, get(LoadOpc)) 337 .addReg(DstReg, true, false, false, isDead) 338 .addImm(0).addFrameIndex(FI); 339 } 340 } 341 break; 342 } 343 344 return NewMI; 345} 346 347//===----------------------------------------------------------------------===// 348// Branch Analysis 349//===----------------------------------------------------------------------===// 350 351/// GetCondFromBranchOpc - Return the Mips CC that matches 352/// the correspondent Branch instruction opcode. 353static Mips::CondCode GetCondFromBranchOpc(unsigned BrOpc) 354{ 355 switch (BrOpc) { 356 default: return Mips::COND_INVALID; 357 case Mips::BEQ : return Mips::COND_E; 358 case Mips::BNE : return Mips::COND_NE; 359 case Mips::BGTZ : return Mips::COND_GZ; 360 case Mips::BGEZ : return Mips::COND_GEZ; 361 case Mips::BLTZ : return Mips::COND_LZ; 362 case Mips::BLEZ : return Mips::COND_LEZ; 363 364 // We dont do fp branch analysis yet! 365 case Mips::BC1T : 366 case Mips::BC1F : return Mips::COND_INVALID; 367 } 368} 369 370/// GetCondBranchFromCond - Return the Branch instruction 371/// opcode that matches the cc. 372unsigned Mips::GetCondBranchFromCond(Mips::CondCode CC) 373{ 374 switch (CC) { 375 default: assert(0 && "Illegal condition code!"); 376 case Mips::COND_E : return Mips::BEQ; 377 case Mips::COND_NE : return Mips::BNE; 378 case Mips::COND_GZ : return Mips::BGTZ; 379 case Mips::COND_GEZ : return Mips::BGEZ; 380 case Mips::COND_LZ : return Mips::BLTZ; 381 case Mips::COND_LEZ : return Mips::BLEZ; 382 383 case Mips::FCOND_F: 384 case Mips::FCOND_UN: 385 case Mips::FCOND_EQ: 386 case Mips::FCOND_UEQ: 387 case Mips::FCOND_OLT: 388 case Mips::FCOND_ULT: 389 case Mips::FCOND_OLE: 390 case Mips::FCOND_ULE: 391 case Mips::FCOND_SF: 392 case Mips::FCOND_NGLE: 393 case Mips::FCOND_SEQ: 394 case Mips::FCOND_NGL: 395 case Mips::FCOND_LT: 396 case Mips::FCOND_NGE: 397 case Mips::FCOND_LE: 398 case Mips::FCOND_NGT: return Mips::BC1T; 399 400 case Mips::FCOND_T: 401 case Mips::FCOND_OR: 402 case Mips::FCOND_NEQ: 403 case Mips::FCOND_OGL: 404 case Mips::FCOND_UGE: 405 case Mips::FCOND_OGE: 406 case Mips::FCOND_UGT: 407 case Mips::FCOND_OGT: 408 case Mips::FCOND_ST: 409 case Mips::FCOND_GLE: 410 case Mips::FCOND_SNE: 411 case Mips::FCOND_GL: 412 case Mips::FCOND_NLT: 413 case Mips::FCOND_GE: 414 case Mips::FCOND_NLE: 415 case Mips::FCOND_GT: return Mips::BC1F; 416 } 417} 418 419/// GetOppositeBranchCondition - Return the inverse of the specified 420/// condition, e.g. turning COND_E to COND_NE. 421Mips::CondCode Mips::GetOppositeBranchCondition(Mips::CondCode CC) 422{ 423 switch (CC) { 424 default: assert(0 && "Illegal condition code!"); 425 case Mips::COND_E : return Mips::COND_NE; 426 case Mips::COND_NE : return Mips::COND_E; 427 case Mips::COND_GZ : return Mips::COND_LEZ; 428 case Mips::COND_GEZ : return Mips::COND_LZ; 429 case Mips::COND_LZ : return Mips::COND_GEZ; 430 case Mips::COND_LEZ : return Mips::COND_GZ; 431 case Mips::FCOND_F : return Mips::FCOND_T; 432 case Mips::FCOND_UN : return Mips::FCOND_OR; 433 case Mips::FCOND_EQ : return Mips::FCOND_NEQ; 434 case Mips::FCOND_UEQ: return Mips::FCOND_OGL; 435 case Mips::FCOND_OLT: return Mips::FCOND_UGE; 436 case Mips::FCOND_ULT: return Mips::FCOND_OGE; 437 case Mips::FCOND_OLE: return Mips::FCOND_UGT; 438 case Mips::FCOND_ULE: return Mips::FCOND_OGT; 439 case Mips::FCOND_SF: return Mips::FCOND_ST; 440 case Mips::FCOND_NGLE:return Mips::FCOND_GLE; 441 case Mips::FCOND_SEQ: return Mips::FCOND_SNE; 442 case Mips::FCOND_NGL: return Mips::FCOND_GL; 443 case Mips::FCOND_LT: return Mips::FCOND_NLT; 444 case Mips::FCOND_NGE: return Mips::FCOND_GE; 445 case Mips::FCOND_LE: return Mips::FCOND_NLE; 446 case Mips::FCOND_NGT: return Mips::FCOND_GT; 447 } 448} 449 450bool MipsInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB, 451 MachineBasicBlock *&TBB, 452 MachineBasicBlock *&FBB, 453 SmallVectorImpl<MachineOperand> &Cond) const 454{ 455 // If the block has no terminators, it just falls into the block after it. 456 MachineBasicBlock::iterator I = MBB.end(); 457 if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) 458 return false; 459 460 // Get the last instruction in the block. 461 MachineInstr *LastInst = I; 462 463 // If there is only one terminator instruction, process it. 464 unsigned LastOpc = LastInst->getOpcode(); 465 if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) { 466 if (!LastInst->getDesc().isBranch()) 467 return true; 468 469 // Unconditional branch 470 if (LastOpc == Mips::J) { 471 TBB = LastInst->getOperand(0).getMBB(); 472 return false; 473 } 474 475 Mips::CondCode BranchCode = GetCondFromBranchOpc(LastInst->getOpcode()); 476 if (BranchCode == Mips::COND_INVALID) 477 return true; // Can't handle indirect branch. 478 479 // Conditional branch 480 // Block ends with fall-through condbranch. 481 if (LastOpc != Mips::COND_INVALID) { 482 int LastNumOp = LastInst->getNumOperands(); 483 484 TBB = LastInst->getOperand(LastNumOp-1).getMBB(); 485 Cond.push_back(MachineOperand::CreateImm(BranchCode)); 486 487 for (int i=0; i<LastNumOp-1; i++) { 488 Cond.push_back(LastInst->getOperand(i)); 489 } 490 491 return false; 492 } 493 } 494 495 // Get the instruction before it if it is a terminator. 496 MachineInstr *SecondLastInst = I; 497 498 // If there are three terminators, we don't know what sort of block this is. 499 if (SecondLastInst && I != MBB.begin() && isUnpredicatedTerminator(--I)) 500 return true; 501 502 // If the block ends with Mips::J and a Mips::BNE/Mips::BEQ, handle it. 503 unsigned SecondLastOpc = SecondLastInst->getOpcode(); 504 Mips::CondCode BranchCode = GetCondFromBranchOpc(SecondLastOpc); 505 506 if (BranchCode != Mips::COND_INVALID && LastOpc == Mips::J) { 507 int SecondNumOp = SecondLastInst->getNumOperands(); 508 509 TBB = SecondLastInst->getOperand(SecondNumOp-1).getMBB(); 510 Cond.push_back(MachineOperand::CreateImm(BranchCode)); 511 512 for (int i=0; i<SecondNumOp-1; i++) { 513 Cond.push_back(SecondLastInst->getOperand(i)); 514 } 515 516 FBB = LastInst->getOperand(0).getMBB(); 517 return false; 518 } 519 520 // If the block ends with two unconditional branches, handle it. The last 521 // one is not executed, so remove it. 522 if ((SecondLastOpc == Mips::J) && (LastOpc == Mips::J)) { 523 TBB = SecondLastInst->getOperand(0).getMBB(); 524 I = LastInst; 525 I->eraseFromParent(); 526 return false; 527 } 528 529 // Otherwise, can't handle this. 530 return true; 531} 532 533unsigned MipsInstrInfo:: 534InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 535 MachineBasicBlock *FBB, 536 const SmallVectorImpl<MachineOperand> &Cond) const { 537 // Shouldn't be a fall through. 538 assert(TBB && "InsertBranch must not be told to insert a fallthrough"); 539 assert((Cond.size() == 3 || Cond.size() == 2 || Cond.size() == 0) && 540 "Mips branch conditions can have two|three components!"); 541 542 if (FBB == 0) { // One way branch. 543 if (Cond.empty()) { 544 // Unconditional branch? 545 BuildMI(&MBB, get(Mips::J)).addMBB(TBB); 546 } else { 547 // Conditional branch. 548 unsigned Opc = GetCondBranchFromCond((Mips::CondCode)Cond[0].getImm()); 549 const TargetInstrDesc &TID = get(Opc); 550 551 if (TID.getNumOperands() == 3) 552 BuildMI(&MBB, TID).addReg(Cond[1].getReg()) 553 .addReg(Cond[2].getReg()) 554 .addMBB(TBB); 555 else 556 BuildMI(&MBB, TID).addReg(Cond[1].getReg()) 557 .addMBB(TBB); 558 559 } 560 return 1; 561 } 562 563 // Two-way Conditional branch. 564 unsigned Opc = GetCondBranchFromCond((Mips::CondCode)Cond[0].getImm()); 565 const TargetInstrDesc &TID = get(Opc); 566 567 if (TID.getNumOperands() == 3) 568 BuildMI(&MBB, TID).addReg(Cond[1].getReg()).addReg(Cond[2].getReg()) 569 .addMBB(TBB); 570 else 571 BuildMI(&MBB, TID).addReg(Cond[1].getReg()).addMBB(TBB); 572 573 BuildMI(&MBB, get(Mips::J)).addMBB(FBB); 574 return 2; 575} 576 577unsigned MipsInstrInfo:: 578RemoveBranch(MachineBasicBlock &MBB) const 579{ 580 MachineBasicBlock::iterator I = MBB.end(); 581 if (I == MBB.begin()) return 0; 582 --I; 583 if (I->getOpcode() != Mips::J && 584 GetCondFromBranchOpc(I->getOpcode()) == Mips::COND_INVALID) 585 return 0; 586 587 // Remove the branch. 588 I->eraseFromParent(); 589 590 I = MBB.end(); 591 592 if (I == MBB.begin()) return 1; 593 --I; 594 if (GetCondFromBranchOpc(I->getOpcode()) == Mips::COND_INVALID) 595 return 1; 596 597 // Remove the branch. 598 I->eraseFromParent(); 599 return 2; 600} 601 602/// BlockHasNoFallThrough - Analyze if MachineBasicBlock does not 603/// fall-through into its successor block. 604bool MipsInstrInfo:: 605BlockHasNoFallThrough(MachineBasicBlock &MBB) const 606{ 607 if (MBB.empty()) return false; 608 609 switch (MBB.back().getOpcode()) { 610 case Mips::RET: // Return. 611 case Mips::JR: // Indirect branch. 612 case Mips::J: // Uncond branch. 613 return true; 614 default: return false; 615 } 616} 617 618/// ReverseBranchCondition - Return the inverse opcode of the 619/// specified Branch instruction. 620bool MipsInstrInfo:: 621ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const 622{ 623 assert( (Cond.size() == 3 || Cond.size() == 2) && 624 "Invalid Mips branch condition!"); 625 Cond[0].setImm(GetOppositeBranchCondition((Mips::CondCode)Cond[0].getImm())); 626 return false; 627} 628