|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectharpoon.Backend.Generic.RegFileInfo
harpoon.Backend.MIPS.RegFileInfo
public class RegFileInfo
RegFileInfo
encapsulates information about the
MIPS register set. This object also implements
Generic.LocationFactory
, allowing the creation of
global registers for the use of the runtime.
Nested Class Summary |
---|
Nested classes/interfaces inherited from class harpoon.Backend.Generic.RegFileInfo |
---|
RegFileInfo.CommonLoc, RegFileInfo.MachineRegLoc, RegFileInfo.SpillException, RegFileInfo.StackOffsetLoc, RegFileInfo.TempLocator |
Nested classes/interfaces inherited from interface harpoon.Backend.Generic.LocationFactory |
---|
LocationFactory.Location |
Constructor Summary | |
---|---|
RegFileInfo()
Creates a RegFileInfo . |
Method Summary | |
---|---|
LocationFactory.Location |
allocateLocation(int type)
Allocate a global register of the specified type and return a handle to it. |
Set |
calleeSave()
|
Set |
callerSave()
|
Temp[] |
getAllRegisters()
Returns an array of Temp s which represent all
the available registers on the machine. |
Temp[] |
getGeneralRegisters()
Returns an array of Temp s for all the registers
that the register allocator can feel free to play with |
Set |
getRegAssignments(Temp t)
Produces a mutable Set of register assignments
that can hold t . |
Temp |
getRegister(int index)
Returns a specific register on the machine. |
int |
getSize(Temp temp)
|
boolean |
isRegister(Temp t)
Checks if t is a element of the register file for
this architecture. |
Set |
liveOnExit()
Returns the Set of registers live at a method's
exit. |
HData |
makeLocationData(Frame f)
Create an HData which allocates static space for
any LocationFactory.Location s that have been created. |
TempFactory |
regTempFactory()
|
Iterator |
suggestRegAssignment(Temp t,
Map regFile,
Collection preassigned)
Analyzes regfile to find free registers that
t can be assigned to. |
Methods inherited from class harpoon.Backend.Generic.RegFileInfo |
---|
allRegs, assignment, expand, getAllRegistersC, getGeneralRegistersC, illegal, maxRegIndex, occupancy, pressure |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Constructor Detail |
---|
public RegFileInfo()
RegFileInfo
.
Method Detail |
---|
public Temp[] getAllRegisters()
RegFileInfo
Temp
s which represent all
the available registers on the machine.
getAllRegisters
in class RegFileInfo
public Temp getRegister(int index)
RegFileInfo
getRegister(index)==getAllRegisters()[index]
getRegister
in class RegFileInfo
public Temp[] getGeneralRegisters()
RegFileInfo
Temp
s for all the registers
that the register allocator can feel free to play with
getGeneralRegisters
in class RegFileInfo
public TempFactory regTempFactory()
public boolean isRegister(Temp t)
RegFileInfo
t
is a element of the register file for
this architecture.
t
is an element of the register file,
Then returns true,
Else returns false.
isRegister
in class RegFileInfo
t
- Temp
that may be part of the register
file.public int getSize(Temp temp)
public Set getRegAssignments(Temp t)
RegFileInfo
Set
of register assignments
that can hold t
. FSK: experimental method.
Set
of possible
register assignments for t
, where each
assignment is an unmodifiable List
of
Register Temp
s. The elements of each
List
are ordered according to proper
placement of the Register-bitlength words of the value in
t
, low-order words first. Every list
returned will have the same length.
The Set returned may be a SortedSet
, in
which case the earlier assignments are favored over later
ones.
getRegAssignments
in class RegFileInfo
public Iterator suggestRegAssignment(Temp t, Map regFile, Collection preassigned) throws RegFileInfo.SpillException
RegFileInfo
regfile
to find free registers that
t
can be assigned to.
(FSK: Need to update this method to incorporate knowledge of
Virtual Register Temps (perhaps it is guaranteed not to throw
a SpillException when given a Virtual Register Temp))
Iterator
of possible assignments (though this is not guaranteed to
be a complete list of all possible choices, merely the
ones that this RegFileInfo
chose to find), or
throws a RegFileInfo.SpillException
with a set of
possible spills.
Note to implementors: Resist the urge to generate an
Iterator
that produces all possible
assignments in series.
In general, register allocation algorithms need to, at some
point, construct an interference graph to represent how the
registers should be assigned. Such a graph would contain a
node for each register assignment (and put interference edges
between assignments that were not allowed for a given
Temp
), which means that even if your
Iterator
did not keep all of the assignments
in memory at once, code that USES your Iterator
may very well do so. Thus, while there may be many
assignments for a Temp
that occupies
more than one register, and it is possible to write an
Iterator
that produces all such assignments, such
an Iterator
would cause an time/space explosion
when applied to a decently sized register file.
Also, realize that it is not enough to ensure that any
one of the set
{ of possible Iterator
s that may be returned }
traverses a reasonably small subset of the assignment space;
you must ensure that the UNION of all possible traversals is
of a reasonable size. This is because the interference graph
that is constructed will not be built from just one Suggestion
Iterator, but rather from an Suggestion Iterator
for each variable that is given a register assignment.
suggestRegAssignment
in class RegFileInfo
t
- Temp
that needs to be assigned to a set
of Registers.regFile
- A mapping from Register Temp
s to
NonRegister Temp
s representing the
current state of the register file. Empty
Register Temp
s should simply not
have an entry in regfile
(as
opposed to the alternative of mapping to some
NoValue object).
List
Iterator
of Register
Temp
s. The Iterator
is
guaranteed to have at least one element. Each
List
represents a safe place for the
value in t
to be stored (safe with regard
to the architecture targeted and the type of
t
, not with regard to the current
contents of regfile
or the data-flow of
the procedure being analyzed). The elements of each
List
in the Iterator
returned are ordered according to proper placement of
the Register-bitlength words of the value in
t
, low-order words first.
RegFileInfo.SpillException
- if the register
file represented by regfile
does not
have any Register Temp
s free to hold a
new value of the type of t
. This
exception will contain the necessary information to
spill some set of registers. After spilling, a
second call to suggestRegAssignment()
can not throw an exception, as long as no new
values have been loaded into the register file
since the point of spilling.public Set liveOnExit()
RegFileInfo
Set
of registers live at a method's
exit.
Set
of register Temp
s of the registers that
should be considered live at the end of a method.
liveOnExit
in class RegFileInfo
public Set callerSave()
public Set calleeSave()
public LocationFactory.Location allocateLocation(int type)
allocateLocation
in interface LocationFactory
type
- a IR.Tree.Type
specifying the type
of the register.public HData makeLocationData(Frame f)
HData
which allocates static space for
any LocationFactory.Location
s that have been created.
As this implementation only allocates global registers, the
HData
returned is always empty.
makeLocationData
in interface LocationFactory
f
- the Generic.Frame
to which the
HData
will belong.
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |