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

Tobias Pape Das.Linux at gmx.de
Mon Sep 8 21:43:25 UTC 2014


Hi,

On 08.09.2014, at 23:23, David T. Lewis <lewis at mail.msen.com> wrote:

> 
> Hi Eliot,
> 
> Agreed, the primitive will need to be rewritten to work with a 64-bit
> SmallInteger. There may be other integer primitives that will need
> attention too, although I have not looked.
> 

Having tried implementing other SqueakVMs, my impression is, that the
SmallInt-is-31-bit assumption is like everywhere. Starting with some
int-primitives and not ending with bitBlt. We really have to be careful
here.

Best
	-Tobias

> Dave
> 
>> Hi David,
>> 
>> On Mon, Sep 8, 2014 at 12:18 PM, David T. Lewis <lewis at mail.msen.com>
>> wrote:
>> 
>>> 
>>> 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.
>>> 
>> 
>> OK, then it is fixing it in a way that will break a 64-bit implementation
>> that uses 64-bit SmallIntegers.   Personally I find the method defective
>> (for reasons already stated), and will be rewriting it soon.
>> 
>> 
>>> 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
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
>> --
>> best,
>> Eliot


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 1625 bytes
Desc: Message signed with OpenPGP using GPGMail
Url : http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20140908/cb2da819/signature-0001.pgp


More information about the Vm-dev mailing list