I have this infamous warning : shift count > width of type
value = (((usqInt) (((usqInt)oop))) >> (3 + 1)) + ((oop & (1 << 3) ? *-1 << ((64 - 3) - 1)* : 0));
It's true, -1 is an int (32 bits) so the 60 bit shift may not work...
May I suggest Smalltalk code change:
^oop asUnsignedInteger >> (self numTagBits + 1) + ((oop anyMask: self smallFloatSignBit) ifTrue: [-1 *asUnsignedInteger* << (64 - self numTagBits - 1)] ifFalse: [0])
vm-dev@lists.squeakfoundation.org