MipsSEISelLowering.cpp revision 042b79625f315da6378d06b5480b15894d6b06b1
1042b79625f315da6378d06b5480b15894d6b06b1Akira Hatanaka//===-- MipsSEISelLowering.cpp - MipsSE DAG Lowering Interface --*- C++ -*-===// 25ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// 35ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// The LLVM Compiler Infrastructure 45ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// 55ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// This file is distributed under the University of Illinois Open Source 65ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// License. See LICENSE.TXT for details. 75ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// 85ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===----------------------------------------------------------------------===// 95ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// 105ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// Subclass of MipsTargetLowering specialized for mips32/64. 115ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka// 125ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka//===----------------------------------------------------------------------===// 135ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "MipsSEISelLowering.h" 145ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "MipsRegisterInfo.h" 155ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "MipsTargetMachine.h" 165ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h" 175ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "llvm/CodeGen/MachineRegisterInfo.h" 185ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "llvm/Support/CommandLine.h" 195ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka#include "llvm/Target/TargetInstrInfo.h" 205ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 215ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakausing namespace llvm; 225ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 235ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakastatic cl::opt<bool> 245ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaEnableMipsTailCalls("enable-mips-tail-calls", cl::Hidden, 255ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka cl::desc("MIPS: Enable tail calls."), cl::init(false)); 265ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 275ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaMipsSETargetLowering::MipsSETargetLowering(MipsTargetMachine &TM) 285ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka : MipsTargetLowering(TM) { 295ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Set up the register classes 305ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka addRegisterClass(MVT::i32, &Mips::CPURegsRegClass); 315ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 325ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (HasMips64) 335ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka addRegisterClass(MVT::i64, &Mips::CPU64RegsRegClass); 345ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 355ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (Subtarget->hasDSP()) { 365ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MVT::SimpleValueType VecTys[2] = {MVT::v2i16, MVT::v4i8}; 375ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 385ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka for (unsigned i = 0; i < array_lengthof(VecTys); ++i) { 395ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka addRegisterClass(VecTys[i], &Mips::DSPRegsRegClass); 405ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 415ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Expand all builtin opcodes. 425ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka for (unsigned Opc = 0; Opc < ISD::BUILTIN_OP_END; ++Opc) 435ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(Opc, VecTys[i], Expand); 445ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 455ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::LOAD, VecTys[i], Legal); 465ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::STORE, VecTys[i], Legal); 475ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::BITCAST, VecTys[i], Legal); 485ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } 495ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } 505ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 515ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (!TM.Options.UseSoftFloat) { 525ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka addRegisterClass(MVT::f32, &Mips::FGR32RegClass); 535ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 545ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // When dealing with single precision only, use libcalls 555ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (!Subtarget->isSingleFloat()) { 565ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (HasMips64) 575ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka addRegisterClass(MVT::f64, &Mips::FGR64RegClass); 585ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka else 595ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka addRegisterClass(MVT::f64, &Mips::AFGR64RegClass); 605ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } 615ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } 625ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 635ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::MEMBARRIER, MVT::Other, Custom); 645ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Custom); 655ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::LOAD, MVT::i32, Custom); 665ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka setOperationAction(ISD::STORE, MVT::i32, Custom); 675ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 685ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka computeRegisterProperties(); 695ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 705ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 715ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakaconst MipsTargetLowering * 725ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakallvm::createMipsSETargetLowering(MipsTargetMachine &TM) { 735ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return new MipsSETargetLowering(TM); 745ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 755ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 765ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 775ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakabool 785ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaMipsSETargetLowering::allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const { 795ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MVT::SimpleValueType SVT = VT.getSimpleVT().SimpleTy; 805ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 815ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka switch (SVT) { 825ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka case MVT::i64: 835ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka case MVT::i32: 845ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (Fast) 855ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka *Fast = true; 865ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return true; 875ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka default: 885ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return false; 895ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } 905ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 915ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 925ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaMachineBasicBlock * 935ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaMipsSETargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI, 945ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineBasicBlock *BB) const { 955ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka switch (MI->getOpcode()) { 965ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka default: 975ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return MipsTargetLowering::EmitInstrWithCustomInserter(MI, BB); 985ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka case Mips::BPOSGE32_PSEUDO: 995ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return emitBPOSGE32(MI, BB); 1005ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } 1015ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 1025ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1035ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakabool MipsSETargetLowering:: 1045ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaisEligibleForTailCallOptimization(const MipsCC &MipsCCInfo, 1055ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka unsigned NextStackOffset, 1065ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka const MipsFunctionInfo& FI) const { 1075ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (!EnableMipsTailCalls) 1085ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return false; 1095ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1105ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Return false if either the callee or caller has a byval argument. 1115ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (MipsCCInfo.hasByValArg() || FI.hasByvalArg()) 1125ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return false; 1135ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1145ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Return true if the callee's argument area is no larger than the 1155ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // caller's. 1165ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return NextStackOffset <= FI.getIncomingArgSize(); 1175ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 1185ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1195ac065a79767cc112eba63136183b7103765d0d3Akira Hatanakavoid MipsSETargetLowering:: 1205ac065a79767cc112eba63136183b7103765d0d3Akira HatanakagetOpndList(SmallVectorImpl<SDValue> &Ops, 1215ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka std::deque< std::pair<unsigned, SDValue> > &RegsToPass, 1225ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage, 1235ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const { 1245ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // T9 should contain the address of the callee function if 1255ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // -reloction-model=pic or it is an indirect call. 1265ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka if (IsPICCall || !GlobalOrExternal) { 1275ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka unsigned T9Reg = IsN64 ? Mips::T9_64 : Mips::T9; 1285ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka RegsToPass.push_front(std::make_pair(T9Reg, Callee)); 1295ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka } else 1305ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka Ops.push_back(Callee); 1315ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1325ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MipsTargetLowering::getOpndList(Ops, RegsToPass, IsPICCall, GlobalOrExternal, 1335ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka InternalLinkage, CLI, Callee, Chain); 1345ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 1355ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1365ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaMachineBasicBlock * MipsSETargetLowering:: 1375ac065a79767cc112eba63136183b7103765d0d3Akira HatanakaemitBPOSGE32(MachineInstr *MI, MachineBasicBlock *BB) const{ 1385ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // $bb: 1395ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // bposge32_pseudo $vr0 1405ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // => 1415ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // $bb: 1425ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // bposge32 $tbb 1435ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // $fbb: 1445ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // li $vr2, 0 1455ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // b $sink 1465ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // $tbb: 1475ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // li $vr1, 1 1485ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // $sink: 1495ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // $vr0 = phi($vr2, $fbb, $vr1, $tbb) 1505ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1515ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineRegisterInfo &RegInfo = BB->getParent()->getRegInfo(); 1525ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 1535ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka const TargetRegisterClass *RC = &Mips::CPURegsRegClass; 1545ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka DebugLoc DL = MI->getDebugLoc(); 1555ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka const BasicBlock *LLVM_BB = BB->getBasicBlock(); 1565ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineFunction::iterator It = llvm::next(MachineFunction::iterator(BB)); 1575ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineFunction *F = BB->getParent(); 1585ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineBasicBlock *FBB = F->CreateMachineBasicBlock(LLVM_BB); 1595ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineBasicBlock *TBB = F->CreateMachineBasicBlock(LLVM_BB); 1605ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MachineBasicBlock *Sink = F->CreateMachineBasicBlock(LLVM_BB); 1615ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka F->insert(It, FBB); 1625ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka F->insert(It, TBB); 1635ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka F->insert(It, Sink); 1645ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1655ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Transfer the remainder of BB and its successor edges to Sink. 1665ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka Sink->splice(Sink->begin(), BB, llvm::next(MachineBasicBlock::iterator(MI)), 1675ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BB->end()); 1685ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka Sink->transferSuccessorsAndUpdatePHIs(BB); 1695ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1705ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Add successors. 1715ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BB->addSuccessor(FBB); 1725ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BB->addSuccessor(TBB); 1735ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka FBB->addSuccessor(Sink); 1745ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka TBB->addSuccessor(Sink); 1755ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1765ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Insert the real bposge32 instruction to $BB. 1775ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BuildMI(BB, DL, TII->get(Mips::BPOSGE32)).addMBB(TBB); 1785ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1795ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Fill $FBB. 1805ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka unsigned VR2 = RegInfo.createVirtualRegister(RC); 1815ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BuildMI(*FBB, FBB->end(), DL, TII->get(Mips::ADDiu), VR2) 1825ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka .addReg(Mips::ZERO).addImm(0); 1835ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BuildMI(*FBB, FBB->end(), DL, TII->get(Mips::B)).addMBB(Sink); 1845ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1855ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Fill $TBB. 1865ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka unsigned VR1 = RegInfo.createVirtualRegister(RC); 1875ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BuildMI(*TBB, TBB->end(), DL, TII->get(Mips::ADDiu), VR1) 1885ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka .addReg(Mips::ZERO).addImm(1); 1895ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1905ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka // Insert phi function to $Sink. 1915ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka BuildMI(*Sink, Sink->begin(), DL, TII->get(Mips::PHI), 1925ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MI->getOperand(0).getReg()) 1935ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka .addReg(VR2).addMBB(FBB).addReg(VR1).addMBB(TBB); 1945ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka 1955ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka MI->eraseFromParent(); // The pseudo instruction is gone now. 1965ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka return Sink; 1975ac065a79767cc112eba63136183b7103765d0d3Akira Hatanaka} 198