def codegenExp( e : Expr, target : Register ) =
if e is of the form
Ident( x ) then
List ( I_Load ( target, x ) )
Const( n ) then
List ( I_LoadImm ( target, n ) )
Binop( lhs, op, rhs ) then
if ( target < maxRegs-1 )
codegenExp ( rhs, target ) ++
codegenExp ( lhs, target+1 ) ++
codegenBinop ( op, target, target+1 )
else
codegenExp ( rhs, target ) ++
List ( I_Push ( target ) ) ++
codegenExp ( lhs, target ) ++
codegenBinopStack ( op, target )
...
def codegenBinop( op : Op, r1 : Register, r2 : Register ) =
if op is of the form
Plus () then List ( I_Plus ( r1, r2 ) )
Minus () then List ( I_Minus ( r1, r2 ) )
...
def codegenBinopStack( op : Op, r : Register ) =
if op is of the form
Plus () then List ( I_PlusStack ( r ) )
Minus () then List ( I_MinusStack ( r ) )
...
Note that this 'merges' the machine language of the register machine with the language of the accumulator machine. In the tutorials, you will be asked to make this precise.
For example the new command
PlusStack r
simply does
r := r + mem ( SP ); SP := ( SP + 1 ) % maxMem