On Thu, Feb 12, 2009 at 11:07 AM, Andreas Raab
<andreas.raab@gmx.de> wrote:
Eliot Miranda wrote:
I'm assuming that in-memory the 64-bit VM has 64-bit oops, right? So the VM has to swizzle 32-bit pointers to 64-bit. I haven't come across this swizzling code yet. I thought that the swizzling was done by the system tracer. Where is the in-VM code to swizzle pointers to 64-bits?
oopForPointer/pointerForOop translate between OOPs and pointers. So you can translate from a 32bit Oop into a 64bit pointer by adding a base address and vice versa.
AFAICT you can produce a 64-bit VM that runs a 32-bit image with this technique, but you can't get a VM that runs both.
- If one fetches 64-bits when converting an oop to an address one can load a 64-bit oop but not a 32-it one, because in fetching 64-bits one will fetch two oops, right?
- if one fetches 32-bits when converting an oop to an address one can load a 32-bit oop but not a 64-it one, because in fetching 32-bits one will incorrectly ignore the upper 32-bits of the oop, right? (Unless of course the upper 32-bits of all oops are zero, but that's not a 64-bit image, that's a 32-bit image masquerading as a waste of space).
So I don't see how this allows one to have a 64-bit VM that can run true 64-bit images. What am I missing?
On the other hand, start-up code that reads a 32-bit image and swizzles it to a full 64-bit image is perfectly sensible and quite easy in the Squeak context because (IIRC) the 64-bit format doesn't do things like widen the SmallInteger range, implement immediate Floats, etc. Its simply a matter of reading the data, writing two words for each oop and scaling each non-SmallInteger oop appropriately. But as I said I don't see this code anywhere.
David, since you've been working on this perhaps you could clear-up the confusion.
Cheers,
- Andreas