[Vm-dev] Cog Primitive Performance

Andres Valloud avalloud at smalltalk.comcastbiz.net
Tue Apr 18 08:52:49 UTC 2017


Yes, the SqR initials are mine.  That's too bad about the comments, at 
the very least there should be something like this:

"This code performs a multiplication by 1664525 mod 2^28 without 
overflowing into large integers."

On 4/18/17 1:48 , Levente Uzonyi wrote:
> The methods in SmallInteger and LargePositiveInteger have the initials
> SqR (that's yours IIRC), but they have no comment.
> The variant in String is originally from 2001 and has never had that
> comment.
>
> Levente
>
> On Mon, 17 Apr 2017, Andres Valloud wrote:
>
>>
>> On 4/17/17 16:45 , Eliot Miranda wrote:
>>> FYI, hash multiply is
>>> hashMultiply
>>> | low |
>>> low := self bitAnd: 16383.
>>> ^(16r260D * low + ((16r260D * (self bitShift: -14) + (16r0065 * low)
>>> bitAnd: 16383) * 16384))
>>> bitAnd: 16r0FFFFFFF
>>>
>>> and when written as a primitive is
>>> hashMultiply
>>> | low |
>>> low := self bitAnd: 16383.
>>> ^(16r260D * low + (16r260D * (self bitShift: -14) + (16r0065 * low) *
>>> 16384))
>>> bitAnd: 16r0FFFFFFF
>>> because we don't care about the multiply by 16384 overflowing; when
>>> written as a primitive it won't overflow into a LargePositiveInteger.
>>
>> Hopefully this doesn't mean the primitive got implemented by actually
>> doing these operations verbatim.  As you have probably seen, that
>> convoluted arithmetic is done this way in Smalltalk only to simulate a
>> 32x32 multiplication bit-anded down to 28 bits without overflowing
>> into large integers (the original code from August 2000 had my initials).
>>
>> At a sufficiently low level such as C, all that complexity is just an
>> unsigned multiplication by 1664525.  The image code should still have
>> a comment to that effect, did it get lost?
>>
>> Andres.
>>
>


More information about the Vm-dev mailing list