David T. Lewis uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker-dtl.440.mcz
==================== Summary ====================
Name: VMMaker-dtl.440 Author: dtl Time: 24 November 2023, 3:41:35.092 pm UUID: d347df2d-ee8f-4564-8178-f628d7327704 Ancestors: VMMaker-dtl.439
Fix undefined C behavior issue for primitiveMultiply and bytecodePrimMultiply.. Overflow must be tested in advance, otherwise aggressive C optimizers lead to e.g. 16r30000000 * 4 ==> -1073741824. Code adopted from oscog for primitiveMultiply, also updated similarly for bytecodePrimMultiply.
=============== Diff against VMMaker-dtl.439 ===============
Item was changed: ----- Method: ContextInterpreter>>bytecodePrimMultiply (in category 'common selector sends') ----- bytecodePrimMultiply + | rcvr arg result overflow | - | rcvr arg result | rcvr := self internalStackValue: 1. arg := self internalStackValue: 0. (self areIntegers: rcvr and: arg) ifTrue: [rcvr := objectMemory integerValueOf: rcvr. arg := objectMemory integerValueOf: arg. + overflow := rcvr > 0 + ifTrue: [arg > 0 + ifTrue: [rcvr > (objectMemory maxSmallInteger / arg)] + ifFalse: [arg < (objectMemory minSmallInteger / rcvr)]] + ifFalse: [arg > 0 + ifTrue: [rcvr < (objectMemory minSmallInteger / arg)] + ifFalse: [(rcvr < 0) and: [arg < (objectMemory maxSmallInteger / rcvr)]]]. + overflow + ifFalse: [result := rcvr * arg. + (arg = 0 or: [(result // arg) = rcvr and: [objectMemory isIntegerValue: result]]) + ifTrue: [self internalPop: 2 thenPush: (objectMemory integerObjectOf: result). + ^ self fetchNextBytecode "success"]]] - result := rcvr * arg. - (arg = 0 or: [(result // arg) = rcvr and: [objectMemory isIntegerValue: result]]) - ifTrue: [self internalPop: 2 thenPush: (objectMemory integerObjectOf: result). - ^ self fetchNextBytecode "success"]] ifFalse: [self initPrimCall. self externalizeIPandSP. self primitiveFloatMultiply: rcvr byArg: arg. self internalizeIPandSP. self successful ifTrue: [^ self fetchNextBytecode "success"]].
messageSelector := self specialSelector: 8. argumentCount := 1. self normalSend. !
Item was changed: ----- Method: InterpreterPrimitives>>primitiveMultiply (in category 'arithmetic integer primitives') ----- primitiveMultiply + | integerRcvr integerArg integerResult overflow | - | integerRcvr integerArg integerResult | integerRcvr := self stackIntegerValue: 1. integerArg := self stackIntegerValue: 0. self successful ifTrue: + [overflow := integerRcvr > 0 + ifTrue: [integerArg > 0 + ifTrue: [integerRcvr > (objectMemory maxSmallInteger / integerArg)] + ifFalse: [integerArg < (objectMemory minSmallInteger / integerRcvr)]] + ifFalse: [integerArg > 0 + ifTrue: [integerRcvr < (objectMemory minSmallInteger / integerArg)] + ifFalse: [(integerRcvr < 0) and: [integerArg < (objectMemory maxSmallInteger / integerRcvr)]]]. + overflow + ifTrue: [self primitiveFail] + ifFalse: + [integerResult := integerRcvr * integerArg. + self pop: 2 thenPush: (objectMemory integerObjectOf: integerResult)]]! - [integerResult := integerRcvr * integerArg. - "check for C overflow by seeing if computation is reversible" - ((integerArg = 0) or: [(integerResult // integerArg) = integerRcvr]) - ifTrue: [self pop2AndPushIntegerIfOK: integerResult] - ifFalse: [self primitiveFail]]!
Item was added: + ----- Method: ObjectMemory>>maxSmallInteger (in category 'interpreter access') ----- + maxSmallInteger + ^1073741823!
Item was added: + ----- Method: ObjectMemory>>minSmallInteger (in category 'interpreter access') ----- + minSmallInteger + ^-1073741824!
Item was changed: ----- Method: VMMaker class>>versionString (in category 'version testing') ----- versionString
"VMMaker versionString"
+ ^'4.20.6'! - ^'4.20.5'!
vm-dev@lists.squeakfoundation.org