The following is a key of the three bit low-tagging scheme:
- 000
- even fixnum
- 001
- function pointer
- 010
- even other-immediate (header-words, characters, symbol-value trap value, etc.)
- 011
- list pointer
- 100
- odd fixnum
- 101
- structure pointer
- 110
- odd other immediate
- 111
- other-pointer to data-blocks (other than conses, structures,
and functions)
This tagging scheme forces a dual-word alignment of data-blocks on the heap,
but this can be pretty negligible:
- RATIOS and COMPLEX must have a header-word anyway since they are not a
major type. This wastes one word for these infrequent data-blocks since
they require two words for the data.
- BIGNUMS must have a header-word and probably contain only one other word
anyway, so we probably don't waste any words here. Most bignums just
barely overflow fixnums, that is by a bit or two.
- Single and double FLOATS?
no waste, or
one word wasted
- SYMBOLS have a pad slot (current called the setf function, but unused.)
Everything else is vector-like including code, so these probably take up
so many words that one extra one doesn't matter.