[Vm-dev] VM Maker: VMMaker.oscog-EstebanLorenzano.1717.mcz
Eliot Miranda
eliot.miranda at gmail.com
Wed Mar 9 07:47:49 UTC 2016
Hi Esteban,
On Tue, Mar 8, 2016 at 11:32 PM, <commits at source.squeak.org> wrote:
>
> Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-EstebanLorenzano.1717.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-EstebanLorenzano.1717
> Author: EstebanLorenzano
> Time: 9 March 2016, 8:31:33.743422 am
> UUID: 271f0af9-e85c-4afc-bf17-c4aa735ddaaa
> Ancestors: VMMaker.oscog-eem.1716
>
> using *machine methods instead singned64... and positive64...
>
> =============== Diff against VMMaker.oscog-eem.1716 ===============
>
> Item was changed:
> ----- Method: ThreadedFFIPlugin>>primitiveFFIIntegerAt (in category
> 'primitives') -----
> primitiveFFIIntegerAt
> "Answer a (signed or unsigned) n byte integer from the given byte
> offset
> in the receiver, using the platform's endianness."
> | isSigned byteSize byteOffset rcvr addr value mask valueOop |
> <var: 'value' type: #usqLong>
> <var: 'mask' type: #usqLong>
> <export: true>
> <inline: false>
> isSigned := interpreterProxy booleanValueOf: (interpreterProxy
> stackValue: 0).
> byteSize := interpreterProxy stackIntegerValue: 1.
> byteOffset := interpreterProxy stackIntegerValue: 2.
> rcvr := interpreterProxy stackObjectValue: 3.
> interpreterProxy failed ifTrue:[^0].
> (byteOffset > 0
> and: [(byteSize between: 1 and: 8)
> and: [(byteSize bitAnd: byteSize - 1) = 0 "a.k.a.
> isPowerOfTwo"]]) ifFalse:
> [^interpreterProxy primitiveFail].
> addr := self ffiAddressOf: rcvr startingAt: byteOffset size:
> byteSize.
> interpreterProxy failed ifTrue:[^0].
> byteSize <= 2
> ifTrue:
> [byteSize = 1
> ifTrue: [value := self cCoerceSimple:
> (interpreterProxy byteAt: addr) to: #'unsigned char']
> ifFalse: [value := self cCoerceSimple:
> (interpreterProxy shortAt: addr) to: #'unsigned short']]
> ifFalse:
> [byteSize = 4
> + ifTrue: [value := self cCoerceSimple:
> (interpreterProxy long32At: addr) to: #'unsigned int']
> - ifTrue: [value := interpreterProxy
> long32At: addr]
> ifFalse: [value := interpreterProxy
> long64At: addr]].
> byteSize < BytesPerWord
> ifTrue:
> [isSigned ifTrue: "sign extend value"
> [mask := 1 << (byteSize * 8 - 1).
> value := (value bitAnd: mask-1) - (value
> bitAnd: mask)].
> "note: byte/short (&long if BytesPerWord=8) never
> exceed SmallInteger range"
> valueOop := interpreterProxy integerObjectOf:
> value]
> ifFalse: "general 64 bit integer; note these never fail"
> [valueOop := isSigned
> +
> ifTrue:[interpreterProxy signedMachineIntegerFor: value]
> +
> ifFalse:[interpreterProxy positiveMachineIntegerFor: value]].
> -
> ifTrue:[interpreterProxy signed64BitIntegerFor: value]
> -
> ifFalse:[interpreterProxy positive64BitIntegerFor: value]].
> ^interpreterProxy pop: 4 thenPush: valueOop!
>
This doesn't make sense to me. The lines
[valueOop := isSigned
+
ifTrue:[interpreterProxy signedMachineIntegerFor: value]
+
ifFalse:[interpreterProxy positiveMachineIntegerFor: value]].
-
ifTrue:[interpreterProxy signed64BitIntegerFor: value]
-
ifFalse:[interpreterProxy positive64BitIntegerFor: value]].
seem wrong. If we're on a 232-bit machine then signedMachineIntegerFor: &
positiveMachineIntegerFor: will fail for 64-bit results, right? Whereas on
both 32- and 64-bit machines signed64BitIntegerFor: &
positive64BitIntegerFor: will work.
I think the bug above is that if BytesPerWord is 4 there is no
sign-extension of 32-bits to 64-bits. So it probably needs to read
ifFalse: "general 64 bit integer; note these never fail"
[(isSigned and: [byteSize = 4]) ifTrue:
"sign-extend 32-bit results to 64-bits..."
[mask := 1 << (byteSize * 8 - 1).
value := (value bitAnd: mask-1) - (value
bitAnd: mask)].
valueOop := isSigned
ifTrue:[interpreterProxy signed64BitIntegerFor: value]
ifFalse:[interpreterProxy positive64BitIntegerFor: value]].
It would really help if you tested both 64-bit and 32-bit VMs if you're
changing this code. I know that's inconvenient but asking me to fix
64-bits if you break it is also unfair :-(.
I will test the above, and if it's right, commit.
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160308/e7bff721/attachment.htm
More information about the Vm-dev
mailing list