The next step after improving the spill heuristics is likely
to be one of the following:
* Spilling context registers directly to the context
* Adding a few more primitives (String>>at: and return true, false, or
* More work on speeding up compilation
* More bug chasing.
There's two reasons to want to spill context registers directly
into the context rather than onto the C stack. First it'll reduce
memory traffic for sends with many arguments or a deep stack. At
the moment the entire stack is copied from the context into registers
when the method is entered (and possibly spilled on the C stack)
then copied back onto the context on exit. For send heavy code this
can lead to code that reads the stack into registers to immediately
write it back out again. This is especially wasteful if that section
of code doesn't use any of the stack variables copied. The second
reason is to allow temporaries and arguments to be held in registers,
if they're moved into registers then it's likely there will be more
spilling as the x86 only has 6 registers available for general use.
The compiler benchmark can try to inline String>>at: and the large
explorers benchmark can try to inline return true and false. Not
having these primitives may be causing Exupery to be slower for some
parts of both benchmarks than the interpreter. These primitives are
inlined into the main interpretation function so are especially
efficient to interpret.
Compilation of large methods has been sped up significantly but medium
and small methods have only smaller gains. Further performance gains
would be nice, if only to make it faster to run larger acceptance
Exupery is currently reliable just enough to develop with. I saw
a crash after a few hours of Seaside development. This is barely
good enough as it's easy to recover using the changes file. I don't
know how to reproduce that crash so haven't tried to debug it.