1a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka//===-- MipsLongBranch.cpp - Emit long branches ---------------------------===// 2a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// 3a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// The LLVM Compiler Infrastructure 4a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// 5a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// This file is distributed under the University of Illinois Open Source 6a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// License. See LICENSE.TXT for details. 7a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// 8a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka//===----------------------------------------------------------------------===// 9a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// 10a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// This pass expands a branch or jump instruction into a long branch if its 11a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// offset is too large to fit into its immediate field. 12a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// 13e11dda8631f1e65417971ee0c2f7a661fc7d0fd7Jack Carter// FIXME: 14e11dda8631f1e65417971ee0c2f7a661fc7d0fd7Jack Carter// 1. Fix pc-region jump instructions which cross 256MB segment boundaries. 15273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka// 2. If program has inline assembly statements whose size cannot be 16e11dda8631f1e65417971ee0c2f7a661fc7d0fd7Jack Carter// determined accurately, load branch target addresses from the GOT. 17a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka//===----------------------------------------------------------------------===// 18a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 19a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#define DEBUG_TYPE "mips-long-branch" 20a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 21a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "Mips.h" 22a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "MCTargetDesc/MipsBaseInfo.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsTargetMachine.h" 24a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/ADT/Statistic.h" 25a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/CodeGen/MachineFunctionPass.h" 26a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h" 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 28a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/Support/CommandLine.h" 29a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/Support/MathExtras.h" 30a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/Target/TargetInstrInfo.h" 31a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/Target/TargetMachine.h" 32a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka#include "llvm/Target/TargetRegisterInfo.h" 33a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 34a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakausing namespace llvm; 35a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 36a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira HatanakaSTATISTIC(LongBranches, "Number of long branches."); 37a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 38a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakastatic cl::opt<bool> SkipLongBranch( 39a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka "skip-mips-long-branch", 40a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka cl::init(false), 41a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka cl::desc("MIPS: Skip long branch pass."), 42a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka cl::Hidden); 43a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 44a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakastatic cl::opt<bool> ForceLongBranch( 45a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka "force-mips-long-branch", 46a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka cl::init(false), 47a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka cl::desc("MIPS: Expand all branches to long format."), 48a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka cl::Hidden); 49a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 50a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakanamespace { 51a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka typedef MachineBasicBlock::iterator Iter; 52a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka typedef MachineBasicBlock::reverse_iterator ReverseIter; 53a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 54a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka struct MBBInfo { 55273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka uint64_t Size, Address; 56a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka bool HasLongBranch; 57a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineInstr *Br; 58a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 59a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBBInfo() : Size(0), HasLongBranch(false), Br(0) {} 60a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka }; 61a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 62a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka class MipsLongBranch : public MachineFunctionPass { 63a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 64a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka public: 65a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka static char ID; 66a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MipsLongBranch(TargetMachine &tm) 67a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka : MachineFunctionPass(ID), TM(tm), 68273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka TII(static_cast<const MipsInstrInfo*>(tm.getInstrInfo())), 69273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka IsPIC(TM.getRelocationModel() == Reloc::PIC_), 70273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()), 71273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka LongBranchSeqSize(!IsPIC ? 2 : (ABI == MipsSubtarget::N64 ? 13 : 9)) {} 72a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 73a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka virtual const char *getPassName() const { 74a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return "Mips Long Branch"; 75a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 76a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 77a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka bool runOnMachineFunction(MachineFunction &F); 78a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 79a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka private: 80a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka void splitMBB(MachineBasicBlock *MBB); 81a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka void initMBBInfo(); 82a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka int64_t computeOffset(const MachineInstr *Br); 83a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka void replaceBranch(MachineBasicBlock &MBB, Iter Br, DebugLoc DL, 84a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineBasicBlock *MBBOpnd); 85a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka void expandToLongBranch(MBBInfo &Info); 86a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 87a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka const TargetMachine &TM; 88a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka const MipsInstrInfo *TII; 89a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineFunction *MF; 90a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka SmallVector<MBBInfo, 16> MBBInfos; 91273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka bool IsPIC; 92273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka unsigned ABI; 93273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka unsigned LongBranchSeqSize; 94a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka }; 95a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 96a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka char MipsLongBranch::ID = 0; 97a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} // end of anonymous namespace 98a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 99a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka/// createMipsLongBranchPass - Returns a pass that converts branches to long 100a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka/// branches. 101a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira HatanakaFunctionPass *llvm::createMipsLongBranchPass(MipsTargetMachine &tm) { 102a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return new MipsLongBranch(tm); 103a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 104a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 105a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka/// Iterate over list of Br's operands and search for a MachineBasicBlock 106a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka/// operand. 107a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakastatic MachineBasicBlock *getTargetMBB(const MachineInstr &Br) { 108a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (unsigned I = 0, E = Br.getDesc().getNumOperands(); I < E; ++I) { 109a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka const MachineOperand &MO = Br.getOperand(I); 110a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 111a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if (MO.isMBB()) 112a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return MO.getMBB(); 113a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 114a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 115a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka assert(false && "This instruction does not have an MBB operand."); 116a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return 0; 117a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 118a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 119a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// Traverse the list of instructions backwards until a non-debug instruction is 120a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// found or it reaches E. 121a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakastatic ReverseIter getNonDebugInstr(ReverseIter B, ReverseIter E) { 122a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (; B != E; ++B) 123a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if (!B->isDebugValue()) 124a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return B; 125a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 126a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return E; 127a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 128a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 129a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// Split MBB if it has two direct jumps/branches. 130a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakavoid MipsLongBranch::splitMBB(MachineBasicBlock *MBB) { 131a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka ReverseIter End = MBB->rend(); 132a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka ReverseIter LastBr = getNonDebugInstr(MBB->rbegin(), End); 133a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 134a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Return if MBB has no branch instructions. 135a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if ((LastBr == End) || 136a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka (!LastBr->isConditionalBranch() && !LastBr->isUnconditionalBranch())) 137a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return; 138a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 139f1ece226125c9e8b0d0311cab7266391743da29bNAKAMURA Takumi ReverseIter FirstBr = getNonDebugInstr(llvm::next(LastBr), End); 140a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 141a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // MBB has only one branch instruction if FirstBr is not a branch 142a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // instruction. 143a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if ((FirstBr == End) || 144a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka (!FirstBr->isConditionalBranch() && !FirstBr->isUnconditionalBranch())) 145a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return; 146a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 147a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka assert(!FirstBr->isIndirectBranch() && "Unexpected indirect branch found."); 148a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 149a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Create a new MBB. Move instructions in MBB to the newly created MBB. 150a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineBasicBlock *NewMBB = 151a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MF->CreateMachineBasicBlock(MBB->getBasicBlock()); 152a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 153a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Insert NewMBB and fix control flow. 154a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineBasicBlock *Tgt = getTargetMBB(*FirstBr); 155a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka NewMBB->transferSuccessors(MBB); 156a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka NewMBB->removeSuccessor(Tgt); 157a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBB->addSuccessor(NewMBB); 158a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBB->addSuccessor(Tgt); 159f1ece226125c9e8b0d0311cab7266391743da29bNAKAMURA Takumi MF->insert(llvm::next(MachineFunction::iterator(MBB)), NewMBB); 160a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 161a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka NewMBB->splice(NewMBB->end(), MBB, (++LastBr).base(), MBB->end()); 162a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 163a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 164a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// Fill MBBInfos. 165a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakavoid MipsLongBranch::initMBBInfo() { 166a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Split the MBBs if they have two branches. Each basic block should have at 167a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // most one branch after this loop is executed. 168a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (MachineFunction::iterator I = MF->begin(), E = MF->end(); I != E;) 169a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka splitMBB(I++); 170a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 171a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MF->RenumberBlocks(); 172a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBBInfos.clear(); 173a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBBInfos.resize(MF->size()); 174a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 175a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (unsigned I = 0, E = MBBInfos.size(); I < E; ++I) { 176a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineBasicBlock *MBB = MF->getBlockNumbered(I); 177a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 178a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Compute size of MBB. 179a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (MachineBasicBlock::instr_iterator MI = MBB->instr_begin(); 180a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MI != MBB->instr_end(); ++MI) 181a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBBInfos[I].Size += TII->GetInstSizeInBytes(&*MI); 182a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 183a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Search for MBB's branch instruction. 184a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka ReverseIter End = MBB->rend(); 185a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka ReverseIter Br = getNonDebugInstr(MBB->rbegin(), End); 186a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 187a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if ((Br != End) && !Br->isIndirectBranch() && 18860287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka (Br->isConditionalBranch() || 18960287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka (Br->isUnconditionalBranch() && 19060287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka TM.getRelocationModel() == Reloc::PIC_))) 191a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBBInfos[I].Br = (++Br).base(); 192a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 193a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 194a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 195a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// Compute offset of branch in number of bytes. 196a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakaint64_t MipsLongBranch::computeOffset(const MachineInstr *Br) { 197a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka int64_t Offset = 0; 198a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka int ThisMBB = Br->getParent()->getNumber(); 199a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka int TargetMBB = getTargetMBB(*Br)->getNumber(); 200a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 201a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Compute offset of a forward branch. 202a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if (ThisMBB < TargetMBB) { 203a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (int N = ThisMBB + 1; N < TargetMBB; ++N) 204a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka Offset += MBBInfos[N].Size; 205a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 206a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return Offset + 4; 207a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 208a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 209a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Compute offset of a backward branch. 210a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (int N = ThisMBB; N >= TargetMBB; --N) 211a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka Offset += MBBInfos[N].Size; 212a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 213a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka return -Offset + 4; 214a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 215a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 216a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// Replace Br with a branch which has the opposite condition code and a 217a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// MachineBasicBlock operand MBBOpnd. 218a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakavoid MipsLongBranch::replaceBranch(MachineBasicBlock &MBB, Iter Br, 219a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka DebugLoc DL, MachineBasicBlock *MBBOpnd) { 2200bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka unsigned NewOpc = TII->GetOppositeBranchOpc(Br->getOpcode()); 221a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka const MCInstrDesc &NewDesc = TII->get(NewOpc); 222a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 223a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineInstrBuilder MIB = BuildMI(MBB, Br, DL, NewDesc); 224a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 225a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (unsigned I = 0, E = Br->getDesc().getNumOperands(); I < E; ++I) { 226a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineOperand &MO = Br->getOperand(I); 227a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 228a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if (!MO.isReg()) { 229a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka assert(MO.isMBB() && "MBB operand expected."); 230a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka break; 231a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 232a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 233a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MIB.addReg(MO.getReg()); 234a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 235a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 236a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MIB.addMBB(MBBOpnd); 237a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 238a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka Br->eraseFromParent(); 239a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 240a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 241a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka// Expand branch instructions to long branches. 242a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakavoid MipsLongBranch::expandToLongBranch(MBBInfo &I) { 24360287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MachineBasicBlock::iterator Pos; 24460287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MachineBasicBlock *MBB = I.Br->getParent(), *TgtMBB = getTargetMBB(*I.Br); 245a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka DebugLoc DL = I.Br->getDebugLoc(); 24660287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka const BasicBlock *BB = MBB->getBasicBlock(); 24760287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MachineFunction::iterator FallThroughMBB = ++MachineFunction::iterator(MBB); 24860287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MachineBasicBlock *LongBrMBB = MF->CreateMachineBasicBlock(BB); 24960287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka 25060287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MF->insert(FallThroughMBB, LongBrMBB); 25160287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MBB->removeSuccessor(TgtMBB); 25260287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MBB->addSuccessor(LongBrMBB); 25360287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka 25460287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka if (IsPIC) { 25560287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MachineBasicBlock *BalTgtMBB = MF->CreateMachineBasicBlock(BB); 25660287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka MF->insert(FallThroughMBB, BalTgtMBB); 25760287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka LongBrMBB->addSuccessor(BalTgtMBB); 25860287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka BalTgtMBB->addSuccessor(TgtMBB); 259a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 2604fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka int64_t TgtAddress = MBBInfos[TgtMBB->getNumber()].Address; 261c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka unsigned BalTgtMBBSize = 5; 262c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka int64_t Offset = TgtAddress - (I.Address + I.Size - BalTgtMBBSize * 4); 2634fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka int64_t Lo = SignExtend64<16>(Offset & 0xffff); 2644fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka int64_t Hi = SignExtend64<16>(((Offset + 0x8000) >> 16) & 0xffff); 265273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 266273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka if (ABI != MipsSubtarget::N64) { 267273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // $longbr: 268273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // addiu $sp, $sp, -8 269273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // sw $ra, 0($sp) 270273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // bal $baltgt 271273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // lui $at, %hi($tgt - $baltgt) 272273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // $baltgt: 273273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // addiu $at, $at, %lo($tgt - $baltgt) 274273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // addu $at, $ra, $at 275273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // lw $ra, 0($sp) 276273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // jr $at 277273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // addiu $sp, $sp, 8 278273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // $fallthrough: 279273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // 280273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 281273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka Pos = LongBrMBB->begin(); 282273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 283273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::ADDiu), Mips::SP) 284273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::SP).addImm(-8); 285273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::SW)).addReg(Mips::RA) 286273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::SP).addImm(0); 28706180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen 28806180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen MIBundleBuilder(*LongBrMBB, Pos) 28906180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::BAL_BR)).addMBB(BalTgtMBB)) 29006180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::LUi), Mips::AT).addImm(Hi)); 291273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 292273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka Pos = BalTgtMBB->begin(); 293273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 294273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::ADDiu), Mips::AT) 295273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::AT).addImm(Lo); 296273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::ADDu), Mips::AT) 297273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::RA).addReg(Mips::AT); 298273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::LW), Mips::RA) 299273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::SP).addImm(0); 30006180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen 30106180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen MIBundleBuilder(*BalTgtMBB, Pos) 30206180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::JR)).addReg(Mips::AT)) 30306180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::ADDiu), Mips::SP) 30406180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .addReg(Mips::SP).addImm(8)); 305273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka } else { 306273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // $longbr: 307273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // daddiu $sp, $sp, -16 308273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // sd $ra, 0($sp) 309273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // lui64 $at, %highest($tgt - $baltgt) 310273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // daddiu $at, $at, %higher($tgt - $baltgt) 311273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // dsll $at, $at, 16 312273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // daddiu $at, $at, %hi($tgt - $baltgt) 313273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // bal $baltgt 314273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // dsll $at, $at, 16 315273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // $baltgt: 316273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // daddiu $at, $at, %lo($tgt - $baltgt) 317273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // daddu $at, $ra, $at 318273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // ld $ra, 0($sp) 319273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // jr64 $at 320273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // daddiu $sp, $sp, 16 321273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // $fallthrough: 322273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // 323273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 3244fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka int64_t Higher = SignExtend64<16>(((Offset + 0x80008000) >> 32) & 0xffff); 3254fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka int64_t Highest = 3264fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka SignExtend64<16>(((Offset + 0x800080008000LL) >> 48) & 0xffff); 327273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 328273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka Pos = LongBrMBB->begin(); 329273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 330273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::DADDiu), Mips::SP_64) 331273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::SP_64).addImm(-16); 332273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::SD)).addReg(Mips::RA_64) 333273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::SP_64).addImm(0); 334273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::LUi64), Mips::AT_64) 335273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addImm(Highest); 336273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::DADDiu), Mips::AT_64) 337273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::AT_64).addImm(Higher); 338273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::DSLL), Mips::AT_64) 339273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::AT_64).addImm(16); 340273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*LongBrMBB, Pos, DL, TII->get(Mips::DADDiu), Mips::AT_64) 341273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::AT_64).addImm(Hi); 34206180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen 34306180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen MIBundleBuilder(*LongBrMBB, Pos) 34406180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::BAL_BR)).addMBB(BalTgtMBB)) 34506180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::DSLL), Mips::AT_64) 34606180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .addReg(Mips::AT_64).addImm(16)); 347273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 348273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka Pos = BalTgtMBB->begin(); 349273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 350273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::DADDiu), Mips::AT_64) 351273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::AT_64).addImm(Lo); 352273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::DADDu), Mips::AT_64) 353273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::RA_64).addReg(Mips::AT_64); 354273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka BuildMI(*BalTgtMBB, Pos, DL, TII->get(Mips::LD), Mips::RA_64) 355273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka .addReg(Mips::SP_64).addImm(0); 35606180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen 35706180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen MIBundleBuilder(*BalTgtMBB, Pos) 35806180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::JR64)).addReg(Mips::AT_64)) 35906180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::DADDiu), Mips::SP_64) 36006180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .addReg(Mips::SP_64).addImm(16)); 36160287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka } 362c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka 363c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka assert(BalTgtMBBSize == BalTgtMBB->size()); 364c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka assert(LongBrMBB->size() + BalTgtMBBSize == LongBranchSeqSize); 36560287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka } else { 36660287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka // $longbr: 36760287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka // j $tgt 36860287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka // nop 36960287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka // $fallthrough: 370a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // 37160287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka Pos = LongBrMBB->begin(); 37260287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka LongBrMBB->addSuccessor(TgtMBB); 37306180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen MIBundleBuilder(*LongBrMBB, Pos) 37406180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::J)).addMBB(TgtMBB)) 37506180bf3f25f2a9828e4c39f63a883aaa6c9452dJakob Stoklund Olesen .append(BuildMI(*MF, DL, TII->get(Mips::NOP))); 376c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka 377c984657c7461ce28b25ca91fdc6caaf2860127fdAkira Hatanaka assert(LongBrMBB->size() == LongBranchSeqSize); 378a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 379a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 38060287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka if (I.Br->isUnconditionalBranch()) { 38160287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka // Change branch destination. 38260287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka assert(I.Br->getDesc().getNumOperands() == 1); 38360287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka I.Br->RemoveOperand(0); 38460287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka I.Br->addOperand(MachineOperand::CreateMBB(LongBrMBB)); 38560287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka } else 38660287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka // Change branch destination and reverse condition. 38760287963c7505180500d63b1c1b90f0f4b337430Akira Hatanaka replaceBranch(*MBB, I.Br, DL, FallThroughMBB); 388a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 389a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 390a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakastatic void emitGPDisp(MachineFunction &F, const MipsInstrInfo *TII) { 391a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineBasicBlock &MBB = F.front(); 392a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MachineBasicBlock::iterator I = MBB.begin(); 393a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka DebugLoc DL = MBB.findDebugLoc(MBB.begin()); 394a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka BuildMI(MBB, I, DL, TII->get(Mips::LUi), Mips::V0) 395a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); 396a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka BuildMI(MBB, I, DL, TII->get(Mips::ADDiu), Mips::V0) 397a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka .addReg(Mips::V0).addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); 398a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MBB.removeLiveIn(Mips::V0); 399a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 400a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 401a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanakabool MipsLongBranch::runOnMachineFunction(MachineFunction &F) { 402a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if ((TM.getRelocationModel() == Reloc::PIC_) && 403a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka TM.getSubtarget<MipsSubtarget>().isABI_O32() && 404a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka F.getInfo<MipsFunctionInfo>()->globalBaseRegSet()) 405a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka emitGPDisp(F, TII); 406a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 407a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if (SkipLongBranch) 408bde801b2a7e20f3de62cacc3ef643cf0ed6e2c27Akira Hatanaka return true; 409a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 410a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MF = &F; 411a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka initMBBInfo(); 412a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 413a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka SmallVector<MBBInfo, 16>::iterator I, E = MBBInfos.end(); 414a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka bool EverMadeChange = false, MadeChange = true; 415a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 416a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka while (MadeChange) { 417a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka MadeChange = false; 418a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 419a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka for (I = MBBInfos.begin(); I != E; ++I) { 420a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // Skip if this MBB doesn't have a branch or the branch has already been 421a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka // converted to a long branch. 422a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka if (!I->Br || I->HasLongBranch) 423a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka continue; 424a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 425273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // Check if offset fits into 16-bit immediate field of branches. 426273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka if (!ForceLongBranch && isInt<16>(computeOffset(I->Br) / 4)) 427273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka continue; 428a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 429273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka I->HasLongBranch = true; 4304fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka I->Size += LongBranchSeqSize * 4; 431a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka ++LongBranches; 432a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka EverMadeChange = MadeChange = true; 433a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 434a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka } 435a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 436273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka if (!EverMadeChange) 437273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka return true; 438273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 439273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // Compute basic block addresses. 440273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka if (TM.getRelocationModel() == Reloc::PIC_) { 441273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka uint64_t Address = 0; 442273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 4434fb08317af55c97f421047f0bdbfdd320ac76936Akira Hatanaka for (I = MBBInfos.begin(); I != E; Address += I->Size, ++I) 444273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka I->Address = Address; 445273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka } 446273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 447273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka // Do the expansion. 448273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka for (I = MBBInfos.begin(); I != E; ++I) 449273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka if (I->HasLongBranch) 450273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka expandToLongBranch(*I); 451273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka 452273956d8c6eed86c8b4d616ecb86f7ff17e127d4Akira Hatanaka MF->RenumberBlocks(); 453a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka 454bde801b2a7e20f3de62cacc3ef643cf0ed6e2c27Akira Hatanaka return true; 455a32ccf92c1d53e0f16d2f29ad1fae75c3aa013a0Akira Hatanaka} 456