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