Java Reference
In-Depth Information
procedure
tree
CG(
T
,
regList
)
r
1
← head
(
regList
)
r
2
(
regList
))
if
T
.
kind
=
Identi f ier
then
/
← head
(
tail
Load a variable.
/
call
generate
(
lw
,
r
1
,
T
.
Identi f ierName
)
else
if
T
.
kind
=
IntegerLiteral
then
/
Load a literal.
/
call
generate
(
li
,
r
1
,
T
.
IntegerValue
)
else
/
T.kind must be a binary operator.
/
le f t
←
T
.
le f tChild
right
←
T
.
rightChild
if
le f t
.
regCount
≥ length
(
regList
)
and
right
.
regCount
≥ length
(
regList
)
then
/
Must spill a register into memory.
/
call
tree
CG(
le f t
,
regList
)
/
Get memory location.
/
temp
← get
T
emp
()
call
generate
(
sw
,
r
1
,
temp
)
call
tree
CG(
right
,
regList
)
call
generate
(
lw
,
r
2
,
temp
)
/
Free memory location.
/
call
free
T
emp
(
temp
)
call
generate
(
T
.
operation
,
r
1
,
r
2
,
r
1)
else
/
There are enough registers; no spilling is needed.
/
if
le f t
.
regCount
≥
right
.
regCount
then
call
tree
CG(
le f t
,
regList
)
call
tree
CG(
right
,tail
(
regList
))
call
generate
(
T
.
operation
,
r
1
,
r
1
,
r
2)
else
call
tree
CG(
right
,
regList
)
call
tree
CG(
le f t
,tail
(
regList
))
call
generate
(
T
.
operation
,
r
1
,
r
2
,
r
1)
end
Figure 13.12: An Algorithm to Generate Optimal Code from Expression
Trees