Split compiled entries and compiled return addresses.
Reallocate tag 4 for return addresses.
This way, a compiled entry can be a pointer to a PC offsets so that
we can construct closures without dynamically generating code and
wrecking the instruction cache, while a compiled return addresses can
be a pointer to a PC, since we never dynamically create indirections
for returns.
For now, the runtime can handle both tags for return addresses.
XXX Only done and tested on x86-64 for now. Other architectures need
to be tested. Might be worthwhile to do this on i386 too, if anyone
still cares about i386.
WARNING: This changes the compiled code interface on all
architectures, so you'll have to build a new compiler running on an
old microcode and use that to compile a new system afresh.
32 files changed: