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