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@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