Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3254.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.3254 Author: eem Time: 6 October 2022, 6:01:40.95799 pm UUID: 3b74b441-2801-46f6-ae88-40b662719aed Ancestors: VMMaker.oscog-eem.3253
Further simplify ThreadedFFIPlugin>>ffiIntegerValueOf:; given that it now answers 64-bit results we can subsume all the isLargePositiveIntegerObject:, isLargeNegativeIntegerObject: & signedMachineIntegerValueOf: cases by a single signed64BitValueOf: case.
Simplify signed64BitValueOf:; it can answer the magnitude related result expression directly, an dthere is no need for the 64-bit magnitude test unless the byte length is 8 (i.e. > 4).
=============== Diff against VMMaker.oscog-eem.3253 ===============
Item was changed: ----- Method: InterpreterPrimitives>>signed64BitValueOf: (in category 'primitive support') ----- signed64BitValueOf: oop "Convert the given object into an integer value. The object may be either a positive SmallInteger or a eight-byte LargeInteger." + | sz negative ok magnitude | - | sz value negative ok magnitude | <inline: false> <returnTypeC: #sqLong> - <var: #value type: #sqLong> <var: #magnitude type: #usqLong> (objectMemory isIntegerObject: oop) ifTrue: [^self cCoerce: (objectMemory integerValueOf: oop) to: #sqLong].
(objectMemory isNonIntegerImmediate: oop) ifTrue: [self primitiveFail. ^0].
ok := objectMemory isClassOfNonImm: oop equalTo: (objectMemory splObj: ClassLargePositiveInteger) compactClassIndex: ClassLargePositiveIntegerCompactIndex. ok ifTrue: [negative := false] ifFalse: [negative := true. ok := objectMemory isClassOfNonImm: oop equalTo: (objectMemory splObj: ClassLargeNegativeInteger) compactClassIndex: ClassLargeNegativeIntegerCompactIndex. ok ifFalse: [self primitiveFail. ^0]]. sz := objectMemory numBytesOfBytes: oop. - sz > (self sizeof: #sqLong) ifTrue: - [self primitiveFail. - ^0].
+ sz > 4 - "self cppIf: SPURVM ifTrue: + [magnitude := objectMemory byteSwapped64IfBigEndian: (objectMemory fetchLong64: 0 ofObject: oop). + (sz > (self sizeof: #sqLong) + or: [negative + ifTrue: [magnitude > 16r8000000000000000] + ifFalse: [magnitude >= 16r8000000000000000]]) ifTrue: + [self primitiveFail. + ^0]] - [""Memory is 8 byte aligned in Spur and oversized bytes are set to zero, so we can safely fetch 8 bytes"" - magnitude := objectMemory byteSwapped64IfBigEndian: (objectMemory fetchLong64: 0 ofObject: oop)] ifFalse: + [magnitude := self cCoerceSimple: (objectMemory byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to: #'unsigned int']. - ["sz > 4 - ifTrue: [magnitude := objectMemory byteSwapped64IfBigEndian: (objectMemory fetchLong64: 0 ofObject: oop)] - ifFalse: [magnitude := self cCoerceSimple: (objectMemory byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to: #'unsigned int']"]".
+ ^negative + ifTrue: [0 - magnitude] + ifFalse: [magnitude]! - (negative - ifTrue: [magnitude > 16r8000000000000000] - ifFalse: [magnitude >= 16r8000000000000000]) - ifTrue: [self primitiveFail. - ^0]. - negative - ifTrue: [value := 0 - magnitude] - ifFalse: [value := magnitude]. - ^value!
Item was changed: ----- Method: InterpreterPrimitives>>signedMachineIntegerValueOf: (in category 'primitive support') ----- signedMachineIntegerValueOf: oop "Answer a signed value of an integer up to the size of a machine word. The object may be either a positive SmallInteger or a LargeInteger of size <= word size." <returnTypeC: #'sqIntptr_t'> | negative ok bs value limit magnitude | <var: #value type: #sqInt> <var: #magnitude type: #'usqIntptr_t'> <var: #limit type: #'usqIntptr_t'> (objectMemory isIntegerObject: oop) ifTrue: [^objectMemory integerValueOf: oop].
(objectMemory isNonIntegerImmediate: oop) ifTrue: [^self primitiveFail].
ok := objectMemory isClassOfNonImm: oop equalTo: (objectMemory splObj: ClassLargePositiveInteger) compactClassIndex: ClassLargePositiveIntegerCompactIndex. ok ifTrue: [negative := false] ifFalse: [negative := true. ok := objectMemory isClassOfNonImm: oop equalTo: (objectMemory splObj: ClassLargeNegativeInteger) compactClassIndex: ClassLargeNegativeIntegerCompactIndex. ok ifFalse: [^self primitiveFail]]. bs := objectMemory numBytesOf: oop. bs > (self sizeof: #'usqIntptr_t') ifTrue: [^self primitiveFail].
+ ((self sizeof: #'sqIntptr_t') = 8 + and: [bs > 4]) - "self cppIf: SPURVM ifTrue: + [magnitude := objectMemory byteSwapped64IfBigEndian: (objectMemory fetchLong64: 0 ofObject: oop)] - [""Memory is 8 byte aligned in Spur and oversized bytes are set to zero, so we can safely fetch 8 bytes"" - magnitude := objectMemory byteSwapped64IfBigEndian: (objectMemory fetchLong64: 0 ofObject: oop)] ifFalse: + [magnitude := self cCoerceSimple: (objectMemory byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to: #'unsigned int']. - ["((self sizeof: #'sqIntptr_t') = 8 - and: [bs > 4]) - ifTrue: - [magnitude := objectMemory byteSwapped64IfBigEndian: (objectMemory fetchLong64: 0 ofObject: oop)] - ifFalse: - [magnitude := self cCoerceSimple: (objectMemory byteSwapped32IfBigEndian: (objectMemory fetchLong32: 0 ofObject: oop)) to: #'unsigned int']"]".
limit := 1 asUnsignedIntegerPtr << ((self sizeof: #'sqIntptr_t') * 8 - 1). (negative ifTrue: [magnitude > limit] ifFalse: [magnitude >= limit]) ifTrue: [self primitiveFail. ^0]. negative ifTrue: [value := 0 - magnitude] ifFalse: [value := magnitude]. ^value!
Item was changed: ----- Method: ThreadedFFIPlugin>>ffiIntegerValueOf: (in category 'callout support') ----- ffiIntegerValueOf: oop "Support for generic callout. Answer an integer value that is coerced as C would do." <inline: true> <returnTypeC: #sqLong> "Support up to int64_t or uint64_t, at least intptr_t; type *MUST* be signed for e.g. correct float conversion." "Cheat with a tag test" (oop anyMask: BytesPerWord - 1) ifTrue: [self cppIf: SPURVM ifTrue: [(interpreterProxy isIntegerObject: oop) ifTrue: [^interpreterProxy integerValueOf: oop]. (interpreterProxy isCharacterObject: oop) ifTrue: "Immediate in Spur" [^interpreterProxy characterValueOf: oop]. (BytesPerWord >= 8 and: [interpreterProxy isFloatObject: oop]) ifTrue: "Immediate in 64-bit Spur" [^interpreterProxy floatValueOf: oop]] ifFalse: [^interpreterProxy integerValueOf: oop]] "only one kind of immediate in v3" ifFalse: [self cppIf: SPURVM + ifFalse: "No non-immediate characters in Spur" - ifTrue: "No non-immediate characters in Spur" - [] - ifFalse: [(interpreterProxy isCharacterObject: oop) ifTrue: [^interpreterProxy characterValueOf: oop]]. (interpreterProxy isFloatObject: oop) ifTrue: [^interpreterProxy floatValueOf: oop]. "In Squeak nil, true & false are always contiguous at the start of old space..." (self oop: oop isGreaterThanOrEqualTo: interpreterProxy nilObject andLessThanOrEqualTo: interpreterProxy trueObject) ifTrue: ["i.e. cheaper than but equivalent to: oop = interpreterProxy nilObject ifTrue: [^0]. @@: should we really allow this???? oop = interpreterProxy falseObject ifTrue: [^0]. oop = interpreterProxy trueObject ifTrue: [^1]." ^oop = interpreterProxy trueObject ifTrue: [1] ifFalse: [0]]. (interpreterProxy isLargePositiveIntegerObject: oop) ifTrue: + [^interpreterProxy positive64BitValueOf: oop]]. + ^interpreterProxy signed64BitValueOf: oop "<- will fail if not integer"! - [^interpreterProxy positive64BitValueOf: oop]. - (interpreterProxy isLargeNegativeIntegerObject: oop) ifTrue: - [^interpreterProxy signed64BitValueOf: oop]]. - ^interpreterProxy signedMachineIntegerValueOf: oop "<- will fail if not integer"!
vm-dev@lists.squeakfoundation.org