[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.
> Hi David,
> and another issue is that "unsigned" is shorthand for "unsigned int",
> 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
> 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:
>> ==================== 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..
>> simple fix (implemented here) is to declare the variable as 32 bit
>> 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
>> 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
>> format 68002.
>> =============== Diff against VMMaker-dtl.349 ===============
>> Item was changed:
>> ----- Method: InterpreterPrimitives>>primitiveBitShift (in category
>> 'arithmetic integer primitives') -----
>> | 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
>> self success: integerArgument <= 31.
>> shifted := integerReceiver << integerArgument.
>> self success: (shifted >> integerArgument) =
>> ] ifFalse: [
>> "Right shift -- OK to lose bits"
>> self success: integerArgument >= -31.
>> shifted := integerReceiver >> (0 -
>> self successful
>> ifTrue: [self push: (self positive32BitIntegerFor:
>> ifFalse: [self unPop: 2]!
>> Item was changed:
>> ----- Method: VMMaker class>>versionString (in category 'version
>> testing') -----
>> "VMMaker versionString"
>> + ^'4.13.6'!
>> - ^'4.13.7'!
More information about the Vm-dev