File: represent
Some types of object (such as single-float
) have multiple possible
representations. Multiple representations are useful mainly when there is a
particularly efficient non-descriptor representation. In this case, there is
the normal descriptor representation, and an alternate non-descriptor
representation.
This possibility brings up two major issues:
First, the representations for TNs are selected by examining all the TN references and attempting to minimize reference costs. Then representation conversion code is introduced.
This phase is in effect a pre-pass to register allocation. The main reason for its existence is that representation conversions may be farily complex (e.g. involving memory allocation), and thus must be discovered before register allocation.
VMR conversion leaves stubs for representation specific move operations.
Representation selection recognizes move
by name. Argument and return
value passing for call VOPs is controlled by the :move-arguments
option
to define-vop
.
Representation selection is also responsible for determining what functions use
the number stack. If any representation is chosen which could involve packing
into the non-descriptor-stack
SB, then we allocate the NFP register
throughout the component. As an optimization, permit the decision of whether a
number stack frame needs to be allocated to be made on a per-function basis.
If a function doesn’t use the number stack, and isn’t in the same tail-set as
any function that uses the number stack, then it doesn’t need a number stack
frame, even if other functions in the component do.