[squeak-dev] <LargePositiveInteger>>BitAnd:> method not needed

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Fri Jun 21 10:40:36 UTC 2013


And as a complement, primitive 14 which is connected to
InterpreterPrimitives>>#primitiveBitAnd effectively works for positive
receiver and argument up to 32 bits.

Bear in mind that SmallInteger maxVal highBit = 30, so it did make sense to
try up to 32 bits.

Yet another strategy would be to connect primitive 34 everywhere both in
small and large ints...



2013/6/21 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>

> Note that some times ago, Andreas and Eliot have added primitives
> exploiting the ubiquitous possibility of performing 64 bits arithmetic in
> underlying C language with modern compilers.
>
> So there is also InterpreterPrimitives>>#primitiveBitAndLargeIntegers
> which works for positive integer receiver and arguments up to 64 bits and
> is currently connected to primitive 34 in both Interpreter and COG VM.
>
> So a possible strategy would be to invoke <primitive: 34> from
> LargePositiveInteger and fall back to super if failed. That may speed up
> some operations on "Small" large integers, and will add a bit more delay
> for "Large" and negative Large integers. Up to you to peek a sufficiently
> recent VM and test...
>
>
> 2013/6/21 Levente Uzonyi <leves at elte.hu>
>
>> On Thu, 20 Jun 2013, Ralph Boland wrote:
>>
>>  I am using Squeak  3.11.  I assume the same results apply to Squeak
>>> 4.4.  If not, my apologies.
>>>
>>
>> LargePositiveInteger >> #bitAnd: is not present in Squeak 4.4.
>>
>>
>>
>>> In Squeak if I evaluate:
>>>
>>> 1)  ((2 << 256)  bitAnd: (2 << 128)) ==>  0
>>> 2)  ((2 << 256)  bitAnd: (2 << 128)) class ==> SmallInteger
>>> 3)  (2 << 128)                               ==>
>>> 680564733841876926926749214863**536422912
>>> 4)  ((2 << 128) bitAnd: (2 << 128))  ==>  680564733841876926926749214863
>>> **536422912
>>>
>>> This all looks correct and I care because I need to do <bitAnd:> of some
>>> largePositiveIntegers.
>>>
>>> But <LargePositiveInteger>>BitAnd:**>  is:
>>>
>>> "Primitive. Answer an Integer whose bits are the logical AND of the
>>>     receiver's bits and those of the argument. Fail if the receiver or
>>> argument
>>>     is greater than 32 bits. See Object documentation whatIsAPrimitive."
>>>     <primitive: 14>
>>>     self halt.          "I ADDED THE HALT"
>>>     ^ super bitAnd: anInteger
>>>
>>> The way I see it  <LargePositiveInteger>>BitAnd:**>   is always going
>>> to fail and thus invoke its super version
>>> (<LargePositiveInteger>>**BitAnd:>)  and this is what I see when I run
>>> the code; i.e. I hit the halt.
>>>
>>> So why have <LargePositiveInteger>>BitAnd:**> method at all?
>>>
>>
>> As the comment says: primitive 14 works for nonnegative SmallIntegers and
>> all LargePositiveIntegers which can be represented in 4 bytes, so all
>> values up to 4294967295.
>>
>> In your image the following expression should use the primitive:
>>
>>         4294967295 bitAnd: 1
>>
>> In this case the primitive should fail:
>>
>>         4294967296 bitAnd: 1
>>
>>
>> Levente
>>
>>
>>
>>> Ditto for the other bit operations.
>>>
>>> Ralph Boland
>>>
>>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20130621/b59c22a5/attachment.htm


More information about the Squeak-dev mailing list