Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3282.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.3282 Author: eem Time: 12 December 2022, 9:23:01.283007 am UUID: c6ec4e7f-ae4d-4ead-a0d1-4be83e94848a Ancestors: VMMaker.oscog-eem.3281
Check the argument count of the target method in the jitted perform primitive. Thanks to Boris Shingarov and Juan Vuletich for finding this.
=============== Diff against VMMaker.oscog-eem.3281 ===============
Item was added: + ----- Method: SimpleStackBasedCogit>>genLoadcmNumArgsOf:into: (in category 'primitive generators') ----- + genLoadcmNumArgsOf: cogMethodReg into: targetReg + "Currently cmNumArgs is the first byte following the objectHeader." + <inline: true> + self MoveMb: objectRepresentation wordSize r: cogMethodReg R: targetReg!
Item was changed: ----- Method: SimpleStackBasedCogit>>genLookupForPerformNumArgs: (in category 'primitive generators') ----- genLookupForPerformNumArgs: numArgs "Compile the code for a probe of the first-level method cache for a perform primitive. The selector is assumed to be in Arg0Reg. Defer to adjustArgumentsForPerform: to adjust the arguments before the jump to the method." + | jumpSelectorMiss jumpClassMiss jumpInterpret jumpBadNumArgs itsAHit cacheBaseReg | - | jumpSelectorMiss jumpClassMiss jumpInterpret itsAHit cacheBaseReg | - <var: #jumpSelectorMiss type: #'AbstractInstruction *'> - <var: #jumpClassMiss type: #'AbstractInstruction *'> - <var: #jumpInterpret type: #'AbstractInstruction *'> - <var: #itsAHit type: #'AbstractInstruction *'>
"N.B. Can't assume TempReg already contains the tag because a method can of course be invoked via the unchecked entry-point, e.g. as does perform:." objectRepresentation genGetInlineCacheClassTagFrom: ReceiverResultReg into: SendNumArgsReg forEntry: false.
self flag: #lookupInMethodCacheSel:classTag:. "so this method shows up as a sender of lookupInMethodCacheSel:class:"
cacheBaseReg := NoReg. (backEnd isWithinMwOffsetRange: coInterpreter methodCacheAddress) ifFalse: [self MoveCq: coInterpreter methodCacheAddress R: (cacheBaseReg := Extra0Reg)].
"Do first of three probes. See CoInterpreter>>lookupInMethodCacheSel:classTag:" jumpSelectorMiss := self compilePerformMethodCacheProbeFor: Arg0Reg withShift: 0 baseRegOrNone: cacheBaseReg. jumpClassMiss := self JumpNonZero: 0.
"Fetch the method, and check if it is cogged." itsAHit := self MoveMw: (cacheBaseReg = NoReg ifTrue: [coInterpreter methodCacheAddress + (MethodCacheMethod << objectMemory shiftForWord)] ifFalse: [MethodCacheMethod << objectMemory shiftForWord]) r: ClassReg R: SendNumArgsReg. "If the method is not compiled fall back on the interpreter primitive." objectRepresentation genLoadSlot: HeaderIndex sourceReg: SendNumArgsReg destReg: ClassReg. jumpInterpret := objectRepresentation genJumpImmediate: ClassReg. + "check the argument count; if it's wrong fall back on the interpreter primitive." + self genLoadcmNumArgsOf: ClassReg into: SendNumArgsReg. + self CmpCq: numArgs R: SendNumArgsReg. + jumpBadNumArgs := self JumpNonZero: 0. + "Adjust arguments and jump to the method's unchecked entry-point." self AddCq: cmNoCheckEntryOffset R: ClassReg. self adjustArgumentsForPerform: numArgs. self JumpR: ClassReg.
"First probe missed. Do second of three probes. Shift hash right one and retry." jumpSelectorMiss jmpTarget: (jumpClassMiss jmpTarget: self Label). jumpSelectorMiss := self compilePerformMethodCacheProbeFor: Arg0Reg withShift: 1 baseRegOrNone: cacheBaseReg. self JumpZero: itsAHit.
"Second probe missed. Do last probe. Shift hash right two and retry." jumpSelectorMiss jmpTarget: self Label. jumpSelectorMiss := self compilePerformMethodCacheProbeFor: Arg0Reg withShift: 2 baseRegOrNone: cacheBaseReg. self JumpZero: itsAHit.
+ "Last probe missed/not jitted/bad num args. Caller will generate the call to fall back on the interpreter primitive." - "Last probe missed. Caller will generate the call to fall back on the interpreter primitive." jumpSelectorMiss jmpTarget: + (jumpInterpret jmpTarget: + (jumpBadNumArgs jmpTarget: self Label)). - (jumpInterpret jmpTarget: self Label). ^0!
vm-dev@lists.squeakfoundation.org