[Vm-dev] VM Maker: VMMaker.oscog-nice.1986.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Tue Nov 8 21:10:36 UTC 2016
This is necessary for LLP64 and it does not break tests on
build.macos64x64/squeak.cog.spur so it should be OK.
It would be interesting to measure if it has any impact on performance.
2016-11-08 22:07 GMT+01:00 <commits at source.squeak.org>:
>
> Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1986.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-nice.1986
> Author: nice
> Time: 8 November 2016, 9:59:38.206628 pm
> UUID: e06214fe-0e06-4c33-9132-03ffe9351cbb
> Ancestors: VMMaker.oscog-nice.1985
>
> Like already the case for the #positive32BitIntegerFor: and
> #signed32BitIntegerFor: , #positive32BitValueOf: and #signed32BitValueOf:
> can be simplified with separate 32/64 bits branches.
>
> Indeed, we know that any 32bits signed/unsigned int will fit into a
> SmallInteger when hasSixtyFourBitImmediates,.
> No need to perform any superfluous testing...
>
> The previous implementation produces a lot of dead code in 64bits VM and
> prevents inlining unecessarily.
>
> =============== Diff against VMMaker.oscog-nice.1985 ===============
>
> Item was added:
> + ----- Method: InterpreterPrimitives>>maybeInlinePositive32BitValueOf:
> (in category 'primitive support') -----
> + maybeInlinePositive32BitValueOf: oop
> + "Convert the given object into an integer value.
> + The object may be either a positive SmallInteger or a four-byte
> LargePositiveInteger."
> + <notOption: #Spur64BitMemoryManager>
> + <returnTypeC: #'unsigned int'>
> + | value ok sz |
> + (objectMemory isIntegerObject: oop) ifTrue:
> + [value := objectMemory integerValueOf: oop.
> + (value < 0) ifTrue:
> + [self primitiveFail. value := 0].
> + ^value].
> +
> + (objectMemory isNonIntegerImmediate: oop)
> + ifTrue:
> + [self primitiveFail.
> + ^0]
> + ifFalse:
> + [ok := objectMemory
> + isClassOfNonImm: oop
> + equalTo: (objectMemory splObj:
> ClassLargePositiveInteger)
> + compactClassIndex:
> ClassLargePositiveIntegerCompactIndex.
> + ok ifFalse:
> + [self primitiveFail.
> + ^0].
> + sz := objectMemory numBytesOfBytes: oop.
> + sz > 4 ifTrue:
> + [self primitiveFail.
> + ^0].
> + ^self cCoerceSimple: (objectMemory
> byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to:
> #'unsigned int']!
>
> Item was added:
> + ----- Method: InterpreterPrimitives>>noInlineSigned32BitValueOf: (in
> category 'primitive support') -----
> + noInlineSigned32BitValueOf: oop
> + "Convert the given object into an integer value.
> + The object may be either a SmallInteger or a four-byte
> LargeInteger."
> + | value negative ok magnitude |
> + <notOption: #Spur64BitMemoryManager>
> + <inline: false>
> + <returnTypeC: #int>
> + <var: #value type: #int>
> + <var: #magnitude type: #'unsigned int'>
> + self deny: objectMemory hasSixtyFourBitImmediates.
> + (objectMemory isIntegerObject: oop) ifTrue:
> + [^objectMemory integerValueOf: oop].
> +
> + (objectMemory isNonIntegerImmediate: oop) ifTrue:
> + [self primitiveFail.
> + ^0].
> +
> + ok := objectMemory
> + isClassOfNonImm: oop
> + equalTo: (objectMemory splObj:
> ClassLargePositiveInteger)
> + compactClassIndex: ClassLargePositiveIntegerCompa
> ctIndex.
> + ok
> + ifTrue: [negative := false]
> + ifFalse:
> + [negative := true.
> + ok := objectMemory isClassOfNonImm: oop
> + equalTo:
> (objectMemory splObj: ClassLargeNegativeInteger)
> + compactClassIndex:
> ClassLargeNegativeIntegerCompactIndex.
> + ok ifFalse:
> + [self primitiveFail.
> + ^0]].
> + (objectMemory numBytesOfBytes: oop) > 4 ifTrue:
> + [^self primitiveFail].
> +
> + magnitude := self cCoerceSimple: (objectMemory
> byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to:
> #'unsigned int'.
> +
> + (negative
> + ifTrue: [magnitude > 16r80000000]
> + ifFalse: [magnitude >= 16r80000000])
> + ifTrue:
> + [self primitiveFail.
> + ^0].
> + negative
> + ifTrue: [value := 0 - magnitude]
> + ifFalse: [value := magnitude].
> + ^value!
>
> Item was changed:
> ----- Method: InterpreterPrimitives>>positive32BitValueOf: (in category
> 'primitive support') -----
> positive32BitValueOf: oop
> "Convert the given object into an integer value.
> The object may be either a positive SmallInteger or a four-byte
> LargePositiveInteger."
> + <returnTypeC: #'unsigned int'>
> + objectMemory hasSixtyFourBitImmediates
> - <returnTypeC: #usqInt>
> - | value ok sz |
> - (objectMemory isIntegerObject: oop) ifTrue:
> - [value := objectMemory integerValueOf: oop.
> - (value < 0
> - or: [objectMemory wordSize > 4
> - and: [self cCode: [(self cCoerceSimple: value to:
> #'unsigned int') ~= value]
> - inSmalltalk: [value >> 32 ~= 0]]])
> ifTrue:
> - [self primitiveFail. value := 0].
> - ^value].
> -
> - (objectMemory hasSixtyFourBitImmediates
> - or: [objectMemory isNonIntegerImmediate: oop])
> ifTrue:
> + [(objectMemory isIntegerObject: oop) ifTrue:
> + [| value64 |
> + value64 := objectMemory integerValueOf:
> oop.
> + (value64 < 0
> + or: [self cCode: [(self
> cCoerceSimple: value64 to: #'unsigned int') ~= value64]
> + inSmalltalk:
> [value64 >> 32 ~= 0]]) ifTrue:
> + [self primitiveFail.
> value64 := 0].
> + ^value64].
> + self primitiveFail.
> + ^0]
> - [self primitiveFail.
> - ^0]
> ifFalse:
> + [^self maybeInlinePositive32BitValueOf: oop]!
> - [ok := objectMemory
> - isClassOfNonImm: oop
> - equalTo: (objectMemory splObj:
> ClassLargePositiveInteger)
> - compactClassIndex:
> ClassLargePositiveIntegerCompactIndex.
> - ok ifFalse:
> - [self primitiveFail.
> - ^0].
> - sz := objectMemory numBytesOfBytes: oop.
> - sz > 4 ifTrue:
> - [self primitiveFail.
> - ^0].
> - ^self cCoerceSimple: (objectMemory
> byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to:
> #'unsigned int']!
>
> Item was changed:
> ----- Method: InterpreterPrimitives>>signed32BitValueOf: (in category
> 'primitive support') -----
> signed32BitValueOf: oop
> "Convert the given object into an integer value.
> + The object may be either a SmallInteger or a four-byte
> LargeInteger."
> - The object may be either a positive SmallInteger or a four-byte
> LargeInteger."
> - | value negative ok magnitude |
> - <inline: false>
> <returnTypeC: #int>
> +
> + objectMemory hasSixtyFourBitImmediates
> + ifTrue:
> + [(objectMemory isIntegerObject: oop) ifTrue:
> - <var: #value type: #int>
> - <var: #magnitude type: #'unsigned int'>
> - <var: #value64 type: #long>
> - (objectMemory isIntegerObject: oop) ifTrue:
> - [objectMemory wordSize = 4
> - ifTrue:
> - [^objectMemory integerValueOf: oop]
> - ifFalse: "Must fail for SmallIntegers with
> digitLength > 4"
> [| value64 |
> value64 := objectMemory integerValueOf:
> oop.
> (self cCode: [(self cCoerceSimple:
> value64 to: #int) ~= value64]
> inSmalltalk: [value64 >>
> 31 ~= 0 and: [value64 >> 31 ~= -1]]) ifTrue:
> [self primitiveFail. value64 := 0].
> + ^value64].
> + self primitiveFail.
> + ^0]
> - ^value64]].
> -
> - (objectMemory isNonIntegerImmediate: oop) ifTrue:
> - [self primitiveFail.
> - ^0].
> -
> - ok := objectMemory
> - isClassOfNonImm: oop
> - equalTo: (objectMemory splObj:
> ClassLargePositiveInteger)
> - compactClassIndex: ClassLargePositiveIntegerCompa
> ctIndex.
> - ok
> - ifTrue: [negative := false]
> ifFalse:
> + [^self noInlineSigned32BitValueOf: oop]!
> - [negative := true.
> - ok := objectMemory isClassOfNonImm: oop
> - equalTo:
> (objectMemory splObj: ClassLargeNegativeInteger)
> - compactClassIndex:
> ClassLargeNegativeIntegerCompactIndex.
> - ok ifFalse:
> - [self primitiveFail.
> - ^0]].
> - (objectMemory numBytesOfBytes: oop) > 4 ifTrue:
> - [^self primitiveFail].
> -
> - magnitude := self cCoerceSimple: (objectMemory
> byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to:
> #'unsigned int'.
> -
> - (negative
> - ifTrue: [magnitude > 16r80000000]
> - ifFalse: [magnitude >= 16r80000000])
> - ifTrue:
> - [self primitiveFail.
> - ^0].
> - negative
> - ifTrue: [value := 0 - magnitude]
> - ifFalse: [value := magnitude].
> - ^value!
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20161108/2279e714/attachment-0001.html>
More information about the Vm-dev
mailing list