[Vm-dev] Cog Primitive Performance

Levente Uzonyi leves at caesar.elte.hu
Tue Apr 18 08:48:08 UTC 2017


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