[Vm-dev] VM Maker: VMMaker-dtl.350.mcz

David T. Lewis lewis at mail.msen.com
Mon Sep 8 19:18:31 UTC 2014


I know that "unsigned" means "unsigned int". That is the intent.

With the primitive as currently implemented, that variable must be 32
bits, otherwise the shift left can successfully produce a five byte large
integer that is truncated to four without failing the primitive. This
change is to fix the current implementation of the primitive in the case
of sizeof(sqInt) == 8.

Dave

>  Hi David,
>
>    and another issue is that "unsigned" is shorthand for "unsigned int",
> so
> if you wanted to generalize the method to handle integers of the system's
> word size (as is the case with 64-bit Spur which will have 61-bit
> SmallIntegers, unlike the 31-bit SmallIntegers in 64-bit Squeak) you'd
> want
> to use "usqInt", not "unsigned".
>
> On Sat, Sep 6, 2014 at 8:45 PM, <commits at source.squeak.org> wrote:
>
>>
>> David T. Lewis uploaded a new version of VMMaker to project VM Maker:
>> http://source.squeak.org/VMMaker/VMMaker-dtl.350.mcz
>>
>> ==================== Summary ====================
>>
>> Name: VMMaker-dtl.350
>> Author: dtl
>> Time: 6 September 2014, 11:44:28.389 pm
>> UUID: 2ad132b0-5fb3-4580-b5a8-29af12c3cb81
>> Ancestors: VMMaker-dtl.349
>>
>> VMMaker 4.13.6
>>
>> Fix primitiveBitShift (primitive 17) for sqInt declared 64 bits, as in a
>> VM for 64-bit image format 68002.
>>
>> In image format 68002, bit shift left failed because of return type
>> limited to a 32-bit large integer, but internally the primitive
>> successfully shifted left into a variable declared as a 64 bit sqInt..
>> The
>> simple fix (implemented here) is to declare the variable as 32 bit
>> unsigned
>> to agree with the 32-bit logic of the existing primitive.
>>
>> Note that permitting a left shift into a 64 bit variable makes sense
>> generally, and the primitive could be recoded to accomodate this for
>> shift
>> left, with the primitive answering positive64BitIntegerFor: rather than
>> positive32BitIntegerFor: in the case of a shift left to allow for the
>> greater range (not implemented in this update).
>>
>> With this update, all KernelTests-Numbers tests pass for the 64-bit
>> image
>> format 68002.
>>
>> =============== Diff against VMMaker-dtl.349 ===============
>>
>> Item was changed:
>>   ----- Method: InterpreterPrimitives>>primitiveBitShift (in category
>> 'arithmetic integer primitives') -----
>>   primitiveBitShift
>>         | integerReceiver integerArgument shifted |
>> +       <var: #shifted type: 'unsigned'>
>> +
>>         integerArgument := self popInteger.
>>         integerReceiver := self popPos32BitInteger.
>>         self successful ifTrue: [
>>                 integerArgument >= 0 ifTrue: [
>>                         "Left shift -- must fail if we lose bits beyond
>> 32"
>>                         self success: integerArgument <= 31.
>>                         shifted := integerReceiver << integerArgument.
>>                         self success: (shifted >> integerArgument) =
>> integerReceiver.
>>                 ] ifFalse: [
>>                         "Right shift -- OK to lose bits"
>>                         self success: integerArgument >= -31.
>>                         shifted := integerReceiver >> (0 -
>> integerArgument).
>>                 ].
>>         ].
>>         self successful
>>                 ifTrue: [self push: (self positive32BitIntegerFor:
>> shifted)]
>>                 ifFalse: [self unPop: 2]!
>>
>> Item was changed:
>>   ----- Method: VMMaker class>>versionString (in category 'version
>> testing') -----
>>   versionString
>>
>>         "VMMaker versionString"
>>
>> +       ^'4.13.6'!
>> -       ^'4.13.7'!
>>
>>
>
>
> --
> best,
> Eliot
>




More information about the Vm-dev mailing list