Implement very simple register allocator.

It reserves stack space for all intermediate results.
It always spills an intermediate result when we run out of registers
even if the result will never be needed again. (In order to elminate
such stores, we need liveness analysis.)

Currently it assumes all variables are of type int.