Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1083.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1083 Author: eem Time: 3 March 2015, 1:17:35.981 pm UUID: 4d0a08c2-6218-4726-816c-1d6e3ae601d8 Ancestors: VMMaker.oscog-eem.1082
Fix disastrous typo in VMMaker.oscog-eem.1081 endianness changes.
=============== Diff against VMMaker.oscog-eem.1082 ===============
Item was changed: ----- Method: InterpreterPrimitives>>magnitude64BitIntegerFor:neg: (in category 'primitive support') ----- magnitude64BitIntegerFor: magnitude neg: isNegative "Return a Large Integer object for the given integer magnitude and sign" | newLargeInteger largeClass highWord sz isSmall smallVal | <var: 'magnitude' type: #usqLong> <var: 'highWord' type: #usqInt>
isSmall := isNegative ifTrue: [magnitude <= (objectMemory maxSmallInteger + 1)] ifFalse: [magnitude <= objectMemory maxSmallInteger]. isSmall ifTrue: [smallVal := self cCoerceSimple: magnitude to: #sqInt. isNegative ifTrue: [smallVal := 0 - smallVal]. ^objectMemory integerObjectOf: smallVal].
largeClass := isNegative ifTrue: [objectMemory classLargeNegativeInteger] ifFalse: [objectMemory classLargePositiveInteger]. objectMemory wordSize = 8 ifTrue: [sz := 8] ifFalse: [(highWord := magnitude >> 32) = 0 ifTrue: [sz := 4] ifFalse: [sz := 5. (highWord := highWord >> 8) = 0 ifFalse: [sz := sz + 1. (highWord := highWord >> 8) = 0 ifFalse: [sz := sz + 1. (highWord := highWord >> 8) = 0 ifFalse: [sz := sz + 1]]]]]. newLargeInteger := objectMemory instantiateClass: largeClass indexableSize: sz. self cppIf: VMBIGENDIAN ifTrue: [sz > 4 ifTrue: [objectMemory storeByte: 7 ofObject: newLargeInteger withValue: (magnitude >> 56 bitAnd: 16rFF); storeByte: 6 ofObject: newLargeInteger withValue: (magnitude >> 48 bitAnd: 16rFF); storeByte: 5 ofObject: newLargeInteger withValue: (magnitude >> 40 bitAnd: 16rFF); storeByte: 4 ofObject: newLargeInteger withValue: (magnitude >> 32 bitAnd: 16rFF)]. objectMemory storeByte: 3 ofObject: newLargeInteger withValue: (magnitude >> 24 bitAnd: 16rFF); storeByte: 2 ofObject: newLargeInteger withValue: (magnitude >> 16 bitAnd: 16rFF); storeByte: 1 ofObject: newLargeInteger withValue: (magnitude >> 8 bitAnd: 16rFF); storeByte: 0 ofObject: newLargeInteger withValue: (magnitude ">> 0" bitAnd: 16rFF)] ifFalse: [sz > 4 ifTrue: + [objectMemory storeLong32: 1 ofObject: newLargeInteger withValue: magnitude >> 32]. - [objectMemory storeLong32: 0 ofObject: newLargeInteger withValue: magnitude >> 32]. objectMemory storeLong32: 0 ofObject: newLargeInteger withValue: magnitude].
^newLargeInteger!
Item was changed: ----- Method: StackInterpreter>>signed64BitIntegerFor: (in category 'primitive support') ----- signed64BitIntegerFor: integerValue <var: 'integerValue' type: #sqLong> "Answer a Large Integer object for the given integer value. N.B. will *not* cause a GC." | newLargeInteger magnitude largeClass highWord sz | <inline: false> <var: 'magnitude' type: #sqLong> <var: 'highWord' type: #usqInt>
objectMemory wordSize = 8 ifTrue: [(objectMemory isIntegerValue: integerValue) ifTrue: [^objectMemory integerObjectOf: integerValue]. sz := 8].
integerValue < 0 ifTrue:[ largeClass := ClassLargeNegativeIntegerCompactIndex. magnitude := 0 - integerValue] ifFalse:[ largeClass := ClassLargePositiveIntegerCompactIndex. magnitude := integerValue].
"Make sure to handle the most -ve value correctly. 0 - most -ve = most -ve and most -ve - 1 is +ve. Alas the simple (negative or: [integerValue - 1 < 0]) fails with contemporary gcc and icc versions with optimization and sometimes without. The shift works on all, touch wood." objectMemory wordSize = 4 ifTrue: [(magnitude <= 16r7FFFFFFF and: [integerValue >= 0 or: [0 ~= (self cCode: [integerValue << 1] inSmalltalk: [integerValue << 1 bitAnd: (1 << 64) - 1])]]) ifTrue: [^self signed32BitIntegerFor: integerValue].
(highWord := magnitude >> 32) = 0 ifTrue: [sz := 4] ifFalse: [sz := 5. (highWord := highWord >> 8) = 0 ifFalse: [sz := sz + 1. (highWord := highWord >> 8) = 0 ifFalse: [sz := sz + 1. (highWord := highWord >> 8) = 0 ifFalse: [sz := sz + 1]]]]].
newLargeInteger := objectMemory eeInstantiateSmallClassIndex: largeClass format: (objectMemory byteFormatForNumBytes: sz) numSlots: sz + 3 // objectMemory bytesPerOop. self cppIf: VMBIGENDIAN ifTrue: [sz > 4 ifTrue: [objectMemory storeByte: 7 ofObject: newLargeInteger withValue: (magnitude >> 56 bitAnd: 16rFF); storeByte: 6 ofObject: newLargeInteger withValue: (magnitude >> 48 bitAnd: 16rFF); storeByte: 5 ofObject: newLargeInteger withValue: (magnitude >> 40 bitAnd: 16rFF); storeByte: 4 ofObject: newLargeInteger withValue: (magnitude >> 32 bitAnd: 16rFF)]. objectMemory storeByte: 3 ofObject: newLargeInteger withValue: (magnitude >> 24 bitAnd: 16rFF); storeByte: 2 ofObject: newLargeInteger withValue: (magnitude >> 16 bitAnd: 16rFF); storeByte: 1 ofObject: newLargeInteger withValue: (magnitude >> 8 bitAnd: 16rFF); storeByte: 0 ofObject: newLargeInteger withValue: (magnitude ">> 0" bitAnd: 16rFF)] ifFalse: [sz > 4 ifTrue: + [objectMemory storeLong32: 1 ofObject: newLargeInteger withValue: magnitude >> 32]. - [objectMemory storeLong32: 0 ofObject: newLargeInteger withValue: magnitude >> 32]. objectMemory storeLong32: 0 ofObject: newLargeInteger withValue: magnitude]. ^newLargeInteger!
vm-dev@lists.squeakfoundation.org