(moved from vm-dev) On Tue, Apr 18, 2017 at 10:27 AM, Nicolas Cellier <[hidden email]> wrote:
Yes I wondered about that too. How could we get different behavior in the 32 vs 64 bit image, while running the same code? One way would be to make SmallInteger abstract and have concrete SmallInteger32 and SmallInteger64 subclasses. In a 32 bit image you would only get SmallInteger32 instances, and in a 64 bit image only SmallInteger64 instances. Most methods would remain in SmallInteger, but 32 or 64 bit specific behavior could be implemented in the subclasses. Seems very clean, but sounds like overkill. A more hackish but less intrusive way would be to have a Monticello package with *overrides which would only be loaded in 64 bit images. Then again, we try to avoid overrides, and we want to use the same config map in both 32 and 64 bit images. Or how about a little compiler hack? Basically the code could read hashMultiply Smalltalk is64Bits ifTrue: [^self * 1664525 bitAnd: 16r0FFFFFFF] ifFalse: [ | low | low := self bitAnd: 16383. ^(16r260D * low + ((16r260D * (self bitShift: -14) + (16r0065 * low) bitAnd: 16383) * 16384)) bitAnd: 16r0FFFFFFF] and the compiler could recognize that "Smalltalk is64Bits" is constant and generate only one of the branches ... I actually quite like this idea, I think :) - Bert - |
On Tue, Apr 18, 2017 at 10:49 AM, Bert Freudenberg <[hidden email]> wrote:
Cool idea but I agree; it's overkill.
BTW, I would replace Smalltalk is64Bits by a class variable updated at start up. But...
KISS :-) I just committed SmallInteger>>hashMultiply "This is a multiplication by by 1664525 mod 2^28 written to avoid overflowing into large integers. The primitive is able to perform the operation with modulo arihmetic." <primitive: 159> | low | low := self bitAnd: 16383. ^(16r260D * low + ((16r260D * (self bitShift: -14) + (16r0065 * low) bitAnd: 16383) * 16384)) bitAnd: 16r0FFFFFFF and this is on the fast side in the latest Cog VMs :-) 159? All the multiply primitives end in 9 :-)
_,,,^..^,,,_ best, Eliot |
Free forum by Nabble | Edit this page |