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