X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FMRegisterInfo.cpp;h=920bb5d3af3f66e6d1294d21a7bc1afa16649b36;hb=f3e1b1d716ccff0ccb387802349c5a813f223241;hp=c47bb45440b505e7939383f571e309f2647ed6c5;hpb=9208bbf5c9f12099de3f0a0716c33b0759075f03;p=oota-llvm.git diff --git a/lib/Target/MRegisterInfo.cpp b/lib/Target/MRegisterInfo.cpp index c47bb45440b..920bb5d3af3 100644 --- a/lib/Target/MRegisterInfo.cpp +++ b/lib/Target/MRegisterInfo.cpp @@ -1,32 +1,64 @@ //===- MRegisterInfo.cpp - Target Register Information Implementation -----===// // +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// // This file implements the MRegisterInfo interface. // //===----------------------------------------------------------------------===// #include "llvm/Target/MRegisterInfo.h" -MRegisterInfo::MRegisterInfo(const MRegisterDesc *D, unsigned NR, - regclass_iterator RCB, regclass_iterator RCE) +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/MachineLocation.h" + +using namespace llvm; + +MRegisterInfo::MRegisterInfo(const TargetRegisterDesc *D, unsigned NR, + regclass_iterator RCB, regclass_iterator RCE, + int CFSO, int CFDO) : Desc(D), NumRegs(NR), RegClassBegin(RCB), RegClassEnd(RCE) { assert(NumRegs < FirstVirtualRegister && "Target has too many physical registers!"); - PhysRegClasses = new const TargetRegisterClass*[NumRegs]; - for (unsigned i = 0; i != NumRegs; ++i) - PhysRegClasses[i] = 0; + CallFrameSetupOpcode = CFSO; + CallFrameDestroyOpcode = CFDO; +} + +MRegisterInfo::~MRegisterInfo() {} - // Fill in the PhysRegClasses map +std::vector MRegisterInfo::getAllocatableSet(MachineFunction &MF) const { + std::vector Allocatable(NumRegs); for (MRegisterInfo::regclass_iterator I = regclass_begin(), - E = regclass_end(); I != E; ++I) - for (unsigned i=0; i < (*I)->getNumRegs(); ++i) { - assert(PhysRegClasses[(*I)->getRegister(i)] == 0 && - "Register in more than one class?"); - PhysRegClasses[(*I)->getRegister(i)] = *I; - } + E = regclass_end(); I != E; ++I) { + const TargetRegisterClass *RC = *I; + for (TargetRegisterClass::iterator I = RC->allocation_order_begin(MF), + E = RC->allocation_order_end(MF); I != E; ++I) + Allocatable[*I] = true; + } + return Allocatable; } +/// getLocation - This method should return the actual location of a frame +/// variable given the frame index. The location is returned in ML. +/// Subclasses should override this method for special handling of frame +/// variables and then call MRegisterInfo::getLocation for the default action. +void MRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, + MachineLocation &ML) const { + MachineFrameInfo *MFI = MF.getFrameInfo(); + ML.set(getFrameRegister(MF), + MFI->getObjectOffset(Index) + MFI->getStackSize()); +} -MRegisterInfo::~MRegisterInfo() { - delete[] PhysRegClasses; +/// getInitialFrameState - Returns a list of machine moves that are assumed +/// on entry to a function. +void +MRegisterInfo::getInitialFrameState(std::vector &Moves) const { + // Default is to do nothing. } +