Remove the SystemZ backend.
[oota-llvm.git] / lib / Target / Blackfin / BlackfinRegisterInfo.cpp
index 619906e37e9353f3096d1a5d4608d447e2fc8a72..0d415c5f342be3e32640e737291d07e82ff9e02b 100644 (file)
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
-#include "llvm/CodeGen/MachineLocation.h"
 #include "llvm/CodeGen/RegisterScavenging.h"
-#include "llvm/Target/TargetFrameInfo.h"
+#include "llvm/Target/TargetFrameLowering.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Type.h"
 #include "llvm/ADT/BitVector.h"
 #include "llvm/ADT/STLExtras.h"
+
+#define GET_REGINFO_TARGET_DESC
+#include "BlackfinGenRegisterInfo.inc"
+
 using namespace llvm;
 
 BlackfinRegisterInfo::BlackfinRegisterInfo(BlackfinSubtarget &st,
                                            const TargetInstrInfo &tii)
-  : BlackfinGenRegisterInfo(BF::ADJCALLSTACKDOWN, BF::ADJCALLSTACKUP),
-    Subtarget(st),
-    TII(tii) {}
+  : BlackfinGenRegisterInfo(BF::RETS), Subtarget(st), TII(tii) {}
 
 const unsigned*
 BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
@@ -48,59 +49,35 @@ BlackfinRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
   return  CalleeSavedRegs;
 }
 
-const TargetRegisterClass* const *BlackfinRegisterInfo::
-getCalleeSavedRegClasses(const MachineFunction *MF) const {
-  using namespace BF;
-  static const TargetRegisterClass * const CalleeSavedRegClasses[] = {
-    &PRegClass,
-    &DRegClass, &DRegClass, &DRegClass, &DRegClass,
-    &PRegClass, &PRegClass, &PRegClass,
-    0 };
-  return CalleeSavedRegClasses;
-}
-
 BitVector
 BlackfinRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
+  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
+
   using namespace BF;
   BitVector Reserved(getNumRegs());
+  Reserved.set(AZ);
+  Reserved.set(AN);
+  Reserved.set(AQ);
+  Reserved.set(AC0);
+  Reserved.set(AC1);
+  Reserved.set(AV0);
+  Reserved.set(AV0S);
+  Reserved.set(AV1);
+  Reserved.set(AV1S);
+  Reserved.set(V);
+  Reserved.set(VS);
+  Reserved.set(CYCLES).set(CYCLES2);
   Reserved.set(L0);
   Reserved.set(L1);
   Reserved.set(L2);
   Reserved.set(L3);
   Reserved.set(SP);
   Reserved.set(RETS);
-  if (hasFP(MF))
+  if (TFI->hasFP(MF))
     Reserved.set(FP);
   return Reserved;
 }
 
-const TargetRegisterClass*
-BlackfinRegisterInfo::getPhysicalRegisterRegClass(unsigned reg, MVT VT) const {
-  assert(isPhysicalRegister(reg) && "reg must be a physical register");
-
-  // Pick the smallest register class of the right type that contains
-  // this physreg.
-  const TargetRegisterClass* BestRC = 0;
-  for (regclass_iterator I = regclass_begin(), E = regclass_end();
-       I != E; ++I) {
-    const TargetRegisterClass* RC = *I;
-    if ((VT == MVT::Other || RC->hasType(VT)) && RC->contains(reg) &&
-        (!BestRC || RC->getNumRegs() < BestRC->getNumRegs()))
-      BestRC = RC;
-  }
-
-  assert(BestRC && "Couldn't find the register class");
-  return BestRC;
-}
-
-// hasFP - Return true if the specified function should have a dedicated frame
-// pointer register.  This is true if the function has variable sized allocas or
-// if frame pointer elimination is disabled.
-bool BlackfinRegisterInfo::hasFP(const MachineFunction &MF) const {
-  const MachineFrameInfo *MFI = MF.getFrameInfo();
-  return NoFramePointerElim || MFI->hasCalls() || MFI->hasVarSizedObjects();
-}
-
 bool BlackfinRegisterInfo::
 requiresRegisterScavenging(const MachineFunction &MF) const {
   return true;
@@ -116,7 +93,7 @@ void BlackfinRegisterInfo::adjustRegister(MachineBasicBlock &MBB,
                                           int delta) const {
   if (!delta)
     return;
-  if (isImm<7>(delta)) {
+  if (isInt<7>(delta)) {
     BuildMI(MBB, I, DL, TII.get(BF::ADDpp_imm7), Reg)
       .addReg(Reg)              // No kill on two-addr operand
       .addImm(delta);
@@ -126,13 +103,15 @@ void BlackfinRegisterInfo::adjustRegister(MachineBasicBlock &MBB,
   // We must load delta into ScratchReg and add that.
   loadConstant(MBB, I, DL, ScratchReg, delta);
   if (BF::PRegClass.contains(Reg)) {
-    assert (BF::PRegClass.contains(ScratchReg));
+    assert(BF::PRegClass.contains(ScratchReg) &&
+           "ScratchReg must be a P register");
     BuildMI(MBB, I, DL, TII.get(BF::ADDpp), Reg)
       .addReg(Reg, RegState::Kill)
       .addReg(ScratchReg, RegState::Kill);
   } else {
-    assert (BF::DRegClass.contains(Reg));
-    assert (BF::DRegClass.contains(ScratchReg));
+    assert(BF::DRegClass.contains(Reg) && "Reg must be a D or P register");
+    assert(BF::DRegClass.contains(ScratchReg) &&
+           "ScratchReg must be a D register");
     BuildMI(MBB, I, DL, TII.get(BF::ADD), Reg)
       .addReg(Reg, RegState::Kill)
       .addReg(ScratchReg, RegState::Kill);
@@ -145,28 +124,28 @@ void BlackfinRegisterInfo::loadConstant(MachineBasicBlock &MBB,
                                         DebugLoc DL,
                                         unsigned Reg,
                                         int value) const {
-  if (isImm<7>(value)) {
+  if (isInt<7>(value)) {
     BuildMI(MBB, I, DL, TII.get(BF::LOADimm7), Reg).addImm(value);
     return;
   }
 
-  if (isUimm<16>(value)) {
+  if (isUInt<16>(value)) {
     BuildMI(MBB, I, DL, TII.get(BF::LOADuimm16), Reg).addImm(value);
     return;
   }
 
-  if (isImm<16>(value)) {
+  if (isInt<16>(value)) {
     BuildMI(MBB, I, DL, TII.get(BF::LOADimm16), Reg).addImm(value);
     return;
   }
 
   // We must split into halves
   BuildMI(MBB, I, DL,
-          TII.get(BF::LOAD16i), getSubReg(Reg, bfin_subreg_hi16))
+          TII.get(BF::LOAD16i), getSubReg(Reg, BF::hi16))
     .addImm((value >> 16) & 0xffff)
     .addReg(Reg, RegState::ImplicitDefine);
   BuildMI(MBB, I, DL,
-          TII.get(BF::LOAD16i), getSubReg(Reg, bfin_subreg_lo16))
+          TII.get(BF::LOAD16i), getSubReg(Reg, BF::lo16))
     .addImm(value & 0xffff)
     .addReg(Reg, RegState::ImplicitKill)
     .addReg(Reg, RegState::ImplicitDefine);
@@ -176,14 +155,17 @@ void BlackfinRegisterInfo::
 eliminateCallFramePseudoInstr(MachineFunction &MF,
                               MachineBasicBlock &MBB,
                               MachineBasicBlock::iterator I) const {
-  if (!hasReservedCallFrame(MF)) {
+  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
+
+  if (!TFI->hasReservedCallFrame(MF)) {
     int64_t Amount = I->getOperand(0).getImm();
     if (Amount != 0) {
-      assert(Amount%4 == 0);
+      assert(Amount%4 == 0 && "Unaligned call frame size");
       if (I->getOpcode() == BF::ADJCALLSTACKDOWN) {
         adjustRegister(MBB, I, I->getDebugLoc(), BF::SP, BF::P1, -Amount);
       } else {
-        assert(I->getOpcode() == BF::ADJCALLSTACKUP);
+        assert(I->getOpcode() == BF::ADJCALLSTACKUP &&
+               "Unknown call frame pseudo instruction");
         adjustRegister(MBB, I, I->getDebugLoc(), BF::SP, BF::P1, Amount);
       }
     }
@@ -198,31 +180,33 @@ static unsigned findScratchRegister(MachineBasicBlock::iterator II,
                                     const TargetRegisterClass *RC,
                                     int SPAdj) {
   assert(RS && "Register scavenging must be on");
-  unsigned Reg = RS->FindUnusedReg(RC, true);
+  unsigned Reg = RS->FindUnusedReg(RC);
   if (Reg == 0)
     Reg = RS->scavengeRegister(RC, II, SPAdj);
   return Reg;
 }
 
-void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
-                                               int SPAdj,
-                                               RegScavenger *RS) const {
-  unsigned i;
+void
+BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
+                                          int SPAdj, RegScavenger *RS) const {
   MachineInstr &MI = *II;
   MachineBasicBlock &MBB = *MI.getParent();
   MachineFunction &MF = *MBB.getParent();
+  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
   DebugLoc DL = MI.getDebugLoc();
 
-  for (i=0; !MI.getOperand(i).isFI(); i++) {
-    assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
+  unsigned FIPos;
+  for (FIPos=0; !MI.getOperand(FIPos).isFI(); ++FIPos) {
+    assert(FIPos < MI.getNumOperands() &&
+           "Instr doesn't have FrameIndex operand!");
   }
-  int FrameIndex = MI.getOperand(i).getIndex();
-  assert(i+1 < MI.getNumOperands() && MI.getOperand(i+1).isImm());
+  int FrameIndex = MI.getOperand(FIPos).getIndex();
+  assert(FIPos+1 < MI.getNumOperands() && MI.getOperand(FIPos+1).isImm());
   int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex)
-    + MI.getOperand(i+1).getImm();
+    + MI.getOperand(FIPos+1).getImm();
   unsigned BaseReg = BF::FP;
-  if (hasFP(MF)) {
-    assert(SPAdj==0);
+  if (TFI->hasFP(MF)) {
+    assert(SPAdj==0 && "Unexpected SP adjust in function with frame pointer");
   } else {
     BaseReg = BF::SP;
     Offset += MF.getFrameInfo()->getStackSize() + SPAdj;
@@ -234,24 +218,24 @@ void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
   case BF::STORE32fi:
     isStore = true;
   case BF::LOAD32fi: {
-    assert(Offset%4 == 0 && "Badly aligned i32 stack access");
-    assert(i==1);
-    MI.getOperand(i).ChangeToRegister(BaseReg, false);
-    MI.getOperand(i+1).setImm(Offset);
-    if (isUimm<6>(Offset)) {
+    assert(Offset%4 == 0 && "Unaligned i32 stack access");
+    assert(FIPos==1 && "Bad frame index operand");
+    MI.getOperand(FIPos).ChangeToRegister(BaseReg, false);
+    MI.getOperand(FIPos+1).setImm(Offset);
+    if (isUInt<6>(Offset)) {
       MI.setDesc(TII.get(isStore
                          ? BF::STORE32p_uimm6m4
                          : BF::LOAD32p_uimm6m4));
       return;
     }
-    if (BaseReg == BF::FP && isUimm<7>(-Offset)) {
+    if (BaseReg == BF::FP && isUInt<7>(-Offset)) {
       MI.setDesc(TII.get(isStore
                          ? BF::STORE32fp_nimm7m4
                          : BF::LOAD32fp_nimm7m4));
-      MI.getOperand(i+1).setImm(-Offset);
+      MI.getOperand(FIPos+1).setImm(-Offset);
       return;
     }
-    if (isImm<18>(Offset)) {
+    if (isInt<18>(Offset)) {
       MI.setDesc(TII.get(isStore
                          ? BF::STORE32p_imm18m4
                          : BF::LOAD32p_imm18m4));
@@ -263,12 +247,12 @@ void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
     break;
   }
   case BF::ADDpp: {
-    assert(MI.getOperand(0).isReg());
+    assert(MI.getOperand(0).isReg() && "ADD instruction needs a register");
     unsigned DestReg = MI.getOperand(0).getReg();
     // We need to produce a stack offset in a P register. We emit:
     // P0 = offset;
     // P0 = BR + P0;
-    assert(i==1);
+    assert(FIPos==1 && "Bad frame index operand");
     loadConstant(MBB, II, DL, DestReg, Offset);
     MI.getOperand(1).ChangeToRegister(DestReg, false, false, true);
     MI.getOperand(2).ChangeToRegister(BaseReg, false);
@@ -277,11 +261,11 @@ void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
   case BF::STORE16fi:
     isStore = true;
   case BF::LOAD16fi: {
-    assert(Offset%2 == 0 && "Badly aligned i16 stack access");
-    assert(i==1);
+    assert(Offset%2 == 0 && "Unaligned i16 stack access");
+    assert(FIPos==1 && "Bad frame index operand");
     // We need a P register to use as an address
     unsigned ScratchReg = findScratchRegister(II, RS, &BF::PRegClass, SPAdj);
-    assert(ScratchReg);
+    assert(ScratchReg && "Could not scavenge register");
     loadConstant(MBB, II, DL, ScratchReg, Offset);
     BuildMI(MBB, II, DL, TII.get(BF::ADDpp), ScratchReg)
       .addReg(ScratchReg, RegState::Kill)
@@ -293,10 +277,10 @@ void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
   }
   case BF::STORE8fi: {
     // This is an AnyCC spill, we need a scratch register.
-    assert(i==1);
+    assert(FIPos==1 && "Bad frame index operand");
     MachineOperand SpillReg = MI.getOperand(0);
     unsigned ScratchReg = findScratchRegister(II, RS, &BF::DRegClass, SPAdj);
-    assert(ScratchReg);
+    assert(ScratchReg && "Could not scavenge register");
     if (SpillReg.getReg()==BF::NCC) {
       BuildMI(MBB, II, DL, TII.get(BF::MOVENCC_z), ScratchReg)
         .addOperand(SpillReg);
@@ -309,20 +293,20 @@ void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
     // STORE D
     MI.setDesc(TII.get(BF::STORE8p_imm16));
     MI.getOperand(0).ChangeToRegister(ScratchReg, false, false, true);
-    MI.getOperand(i).ChangeToRegister(BaseReg, false);
-    MI.getOperand(i+1).setImm(Offset);
+    MI.getOperand(FIPos).ChangeToRegister(BaseReg, false);
+    MI.getOperand(FIPos+1).setImm(Offset);
     break;
   }
   case BF::LOAD8fi: {
     // This is an restore, we need a scratch register.
-    assert(i==1);
+    assert(FIPos==1 && "Bad frame index operand");
     MachineOperand SpillReg = MI.getOperand(0);
     unsigned ScratchReg = findScratchRegister(II, RS, &BF::DRegClass, SPAdj);
-    assert(ScratchReg);
+    assert(ScratchReg && "Could not scavenge register");
     MI.setDesc(TII.get(BF::LOAD32p_imm16_8z));
     MI.getOperand(0).ChangeToRegister(ScratchReg, true);
-    MI.getOperand(i).ChangeToRegister(BaseReg, false);
-    MI.getOperand(i+1).setImm(Offset);
+    MI.getOperand(FIPos).ChangeToRegister(BaseReg, false);
+    MI.getOperand(FIPos+1).setImm(Offset);
     ++II;
     if (SpillReg.getReg()==BF::CC) {
       // CC = D
@@ -342,105 +326,11 @@ void BlackfinRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
   }
 }
 
-void BlackfinRegisterInfo::
-processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
-                                     RegScavenger *RS) const {
-  MachineFrameInfo *MFI = MF.getFrameInfo();
-  const TargetRegisterClass *RC = BF::DPRegisterClass;
-  if (requiresRegisterScavenging(MF)) {
-    // Reserve a slot close to SP or frame pointer.
-    RS->setScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(),
-                                                       RC->getAlignment()));
-  }
-}
-
-void BlackfinRegisterInfo::
-processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
-}
-
-// Emit a prologue that sets up a stack frame.
-// On function entry, R0-R2 and P0 may hold arguments.
-// R3, P1, and P2 may be used as scratch registers
-void BlackfinRegisterInfo::emitPrologue(MachineFunction &MF) const {
-  MachineBasicBlock &MBB = MF.front();   // Prolog goes in entry BB
-  MachineBasicBlock::iterator MBBI = MBB.begin();
-  MachineFrameInfo *MFI = MF.getFrameInfo();
-  DebugLoc dl = (MBBI != MBB.end()
-                 ? MBBI->getDebugLoc()
-                 : DebugLoc::getUnknownLoc());
-
-  int FrameSize = MFI->getStackSize();
-  if (FrameSize%4) {
-    FrameSize = (FrameSize+3) & ~3;
-    MFI->setStackSize(FrameSize);
-  }
-
-  if (!hasFP(MF)) {
-    // So far we only support FP elimination on leaf functions
-    assert(!MFI->hasCalls());
-    adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, -FrameSize);
-    return;
-  }
-
-  // emit a LINK instruction
-  if (FrameSize <= 0x3ffff) {
-    BuildMI(MBB, MBBI, dl, TII.get(BF::LINK)).addImm(FrameSize);
-    return;
-  }
-
-  // Frame is too big, do a manual LINK:
-  // [--SP] = RETS;
-  // [--SP] = FP;
-  // FP = SP;
-  // P1 = -FrameSize;
-  // SP = SP + P1;
-  BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH))
-    .addReg(BF::RETS, RegState::Kill);
-  BuildMI(MBB, MBBI, dl, TII.get(BF::PUSH))
-    .addReg(BF::FP, RegState::Kill);
-  BuildMI(MBB, MBBI, dl, TII.get(BF::MOVE), BF::FP)
-    .addReg(BF::SP);
-  loadConstant(MBB, MBBI, dl, BF::P1, -FrameSize);
-  BuildMI(MBB, MBBI, dl, TII.get(BF::ADDpp), BF::SP)
-    .addReg(BF::SP, RegState::Kill)
-    .addReg(BF::P1, RegState::Kill);
-
-}
-
-void BlackfinRegisterInfo::emitEpilogue(MachineFunction &MF,
-                                        MachineBasicBlock &MBB) const {
-  MachineFrameInfo *MFI = MF.getFrameInfo();
-  MachineBasicBlock::iterator MBBI = prior(MBB.end());
-  DebugLoc dl = MBBI->getDebugLoc();
+unsigned
+BlackfinRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
+  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
 
-  int FrameSize = MFI->getStackSize();
-  assert(FrameSize%4 == 0 && "Misaligned frame size");
-
-  if (!hasFP(MF)) {
-    // So far we only support FP elimination on leaf functions
-    assert(!MFI->hasCalls());
-    adjustRegister(MBB, MBBI, dl, BF::SP, BF::P1, FrameSize);
-    return;
-  }
-
-  // emit an UNLINK instruction
-  BuildMI(MBB, MBBI, dl, TII.get(BF::UNLINK));
-}
-
-unsigned BlackfinRegisterInfo::getRARegister() const {
-  return BF::RETS;
-}
-
-unsigned BlackfinRegisterInfo::getFrameRegister(MachineFunction &MF) const {
-  return hasFP(MF) ? BF::FP : BF::SP;
-}
-
-int
-BlackfinRegisterInfo::getFrameIndexOffset(MachineFunction &MF, int FI) const {
-  const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
-  MachineFrameInfo *MFI = MF.getFrameInfo();
-  return MFI->getObjectOffset(FI) + MFI->getStackSize() -
-    TFI.getOffsetOfLocalArea() + MFI->getOffsetAdjustment();
+  return TFI->hasFP(MF) ? BF::FP : BF::SP;
 }
 
 unsigned BlackfinRegisterInfo::getEHExceptionRegister() const {
@@ -452,11 +342,3 @@ unsigned BlackfinRegisterInfo::getEHHandlerRegister() const {
   llvm_unreachable("What is the exception handler register");
   return 0;
 }
-
-int BlackfinRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
-  llvm_unreachable("What is the dwarf register number");
-  return -1;
-}
-
-#include "BlackfinGenRegisterInfo.inc"
-