Tom Braun uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog.seperateMarking-WoC.3339.mcz
==================== Summary ====================
Name: VMMaker.oscog.seperateMarking-WoC.3339 Author: WoC Time: 13 July 2023, 1:38:47.280388 am UUID: 62fe3987-1c08-4b69-9b5e-e8c4771fee69 Ancestors: VMMaker.oscog.seperateMarking-WoC.3338
- added missing trampoline for ClassReg (hopefully the last I didn't know about...)
=============== Diff against VMMaker.oscog.seperateMarking-WoC.3338 ===============
Item was changed: CogObjectRepresentation subclass: #CogObjectRepresentationForSpur + instanceVariableNames: 'ceRetractWavefrontTrampoline ceTricolorCheckArg0Trampoline ceTricolorCheckArg1Trampoline ceTricolorCheckClassRegTrampoline ceScheduleScavengeTrampoline ceSmallActiveContextInMethodTrampoline ceSmallActiveContextInBlockTrampoline ceSmallActiveContextInFullBlockTrampoline ceLargeActiveContextInMethodTrampoline ceLargeActiveContextInBlockTrampoline ceLargeActiveContextInFullBlockTrampoline ceStoreCheckContextReceiverTrampoline ceStoreTrampolines ceNewHashTrampoline ceInlineNewHashTrampoline' - instanceVariableNames: 'ceRetractWavefrontTrampoline ceTricolorCheckArg0Trampoline ceTricolorCheckArg1Trampoline ceScheduleScavengeTrampoline ceSmallActiveContextInMethodTrampoline ceSmallActiveContextInBlockTrampoline ceSmallActiveContextInFullBlockTrampoline ceLargeActiveContextInMethodTrampoline ceLargeActiveContextInBlockTrampoline ceLargeActiveContextInFullBlockTrampoline ceStoreCheckContextReceiverTrampoline ceStoreTrampolines ceNewHashTrampoline ceInlineNewHashTrampoline' classVariableNames: 'CheckRememberedInTrampoline NumStoreTrampolines' poolDictionaries: 'VMBytecodeConstants VMSqueakClassIndices' category: 'VMMaker-JIT'!
Item was changed: ----- Method: CogObjectRepresentationForSpur>>genStoreCheckReceiverReg:valueReg:scratchReg:inFrame: (in category 'compile abstract instructions') ----- genStoreCheckReceiverReg: destReg valueReg: valueReg scratchReg: scratchReg inFrame: inFrame "Generate the code for a store check of valueReg into destReg." | jmpImmediate jmpDestYoung jmpSourceOld jmpAlreadyRemembered jmpYoungBranch jmpNotMarked jmpNotMarking | <var: #jmpImmediate type: #'AbstractInstruction *'> <var: #jmpDestYoung type: #'AbstractInstruction *'> <var: #jmpSourceOld type: #'AbstractInstruction *'> <var: #jmpAlreadyRemembered type: #'AbstractInstruction *'> <staticallyResolveReceiver: 'objectMemory gc' to: #SpurIncrementalGarbageCollector> "Is value stored an immediate? If so we're done" jmpImmediate := self genJumpImmediate: valueReg. "Get the old/new boundary in scratchReg" cogit MoveCw: objectMemory storeCheckBoundary R: scratchReg. "Is target young? If so we're done" cogit CmpR: scratchReg R: destReg. "N.B. FLAGS := destReg - scratchReg" jmpDestYoung := cogit JumpBelow: 0. "Is value stored old? If so we're done." cogit CmpR: scratchReg R: valueReg. "N.B. FLAGS := valueReg - scratchReg" jmpSourceOld := cogit JumpAboveOrEqual: 0. "value is young and target is old. Need to remember this only if the remembered bit is not already set." CheckRememberedInTrampoline ifFalse: [jmpAlreadyRemembered := self genCheckRememberedBitOf: destReg scratch: scratchReg]. "Remembered bit is not set. Call store check to insert dest into remembered table." self assert: destReg = ReceiverResultReg. cogit evaluateTrampolineCallBlock: [cogit CallRT: ceStoreCheckTrampoline] protectLinkRegIfNot: inFrame.
objectMemory gc isIncremental ifTrue: [ jmpYoungBranch := cogit Jump: 0. jmpSourceOld jmpTarget: cogit Label. "is the gc currently marking?" cogit MoveAw: objectMemory marker currentlyActive R: scratchReg. cogit CmpCq: 0 R: scratchReg. jmpNotMarking := cogit JumpZero: 0. "is the mark bit set? If yes trigger the tricolor barrier" jmpNotMarked := self genCheckMarkBitOf: destReg scratch: scratchReg.
+ self assert: (valueReg = Arg0Reg or: [valueReg = Arg1Reg or: [valueReg = ClassReg]]). - self assert: (valueReg = Arg0Reg or: [valueReg = Arg1Reg]). valueReg = Arg0Reg ifTrue: [cogit evaluateTrampolineCallBlock: [cogit CallRT: ceTricolorCheckArg0Trampoline] protectLinkRegIfNot: inFrame]. valueReg = Arg1Reg ifTrue: [cogit evaluateTrampolineCallBlock: [cogit CallRT: ceTricolorCheckArg1Trampoline] + protectLinkRegIfNot: inFrame]. + valueReg = ClassReg + ifTrue: [cogit + evaluateTrampolineCallBlock: [cogit CallRT: ceTricolorCheckClassRegTrampoline] protectLinkRegIfNot: inFrame]]. (jmpImmediate jmpTarget: (jmpDestYoung jmpTarget: cogit Label)). CheckRememberedInTrampoline ifFalse: [jmpAlreadyRemembered jmpTarget: jmpDestYoung getJmpTarget]. objectMemory gc isIncremental ifTrue: [ jmpYoungBranch jmpTarget: (jmpNotMarked jmpTarget: (jmpNotMarking jmpTarget: jmpDestYoung getJmpTarget))] ifFalse: [jmpSourceOld jmpTarget: jmpDestYoung getJmpTarget]. ^0!
Item was added: + ----- Method: CogObjectRepresentationForSpur>>genTricolorCheckClassRegTrampoline (in category 'initialization') ----- + genTricolorCheckClassRegTrampoline + + <inline: true> + "SIM_ prefix comes from static polymorphism. unfortunately it is necessary :(" + ^cogit + genTrampolineFor: #SIM_markAndShouldScan: + called: 'ceTricolorCheckTrampoline' + numArgs: 1 + arg: ClassReg + arg: nil + arg: nil + arg: nil + regsToSave: CallerSavedRegisterMask + pushLinkReg: true + resultReg: NoReg + appendOpcodes: false!
Item was changed: ----- Method: CogObjectRepresentationForSpur>>generateObjectRepresentationTrampolines (in category 'initialization') ----- generateObjectRepresentationTrampolines "Do the store check. Answer the argument for the benefit of the code generator; ReceiverResultReg may be caller-saved and hence smashed by this call. Answering it allows the code generator to reload ReceiverResultReg cheaply. In Spur the only thing we leave to the run-time is adding the receiver to the remembered set and setting its isRemembered bit." <staticallyResolveReceiver: 'objectMemory gc' to: #SpurIncrementalGarbageCollector> self cppIf: IMMUTABILITY ifTrue: [self cCode: [] inSmalltalk: [ceStoreTrampolines := CArrayAccessor on: (Array new: NumStoreTrampolines)]. 0 to: NumStoreTrampolines - 1 do: [:instVarIndex | ceStoreTrampolines at: instVarIndex put: (self genStoreTrampolineCalled: (cogit trampolineName: 'ceStoreTrampoline' numArgs: instVarIndex limit: NumStoreTrampolines - 2) instVarIndex: instVarIndex)]]. ceNewHashTrampoline := self genNewHashTrampoline: false called: 'ceNewHash'. SistaVM ifTrue: [ceInlineNewHashTrampoline := self genNewHashTrampoline: true called: 'ceInlineNewHash']. ceStoreCheckTrampoline := self genStoreCheckTrampoline. objectMemory gc isIncremental ifTrue: [ceTricolorCheckArg0Trampoline := self genTricolorCheckArg0Trampoline. ceTricolorCheckArg1Trampoline := self genTricolorCheckArg1Trampoline. + ceTricolorCheckClassRegTrampoline := self genTricolorCheckClassRegTrampoline. ceRetractWavefrontTrampoline := self genRetractWavefrontTrampoline]. ceStoreCheckContextReceiverTrampoline := self genStoreCheckContextReceiverTrampoline. ceScheduleScavengeTrampoline := cogit genTrampolineFor: #ceScheduleScavenge called: 'ceScheduleScavengeTrampoline' regsToSave: CallerSavedRegisterMask. ceSmallActiveContextInMethodTrampoline := self genActiveContextTrampolineLarge: false inBlock: 0 called: 'ceSmallMethodContext'. ceSmallActiveContextInBlockTrampoline := self genActiveContextTrampolineLarge: false inBlock: InVanillaBlock called: 'ceSmallBlockContext'. SistaV1BytecodeSet ifTrue: [ceSmallActiveContextInFullBlockTrampoline := self genActiveContextTrampolineLarge: false inBlock: InFullBlock called: 'ceSmallFullBlockContext']. ceLargeActiveContextInMethodTrampoline := self genActiveContextTrampolineLarge: true inBlock: 0 called: 'ceLargeMethodContext'. ceLargeActiveContextInBlockTrampoline := self genActiveContextTrampolineLarge: true inBlock: InVanillaBlock called: 'ceLargeBlockContext'. SistaV1BytecodeSet ifTrue: [ceLargeActiveContextInFullBlockTrampoline := self genActiveContextTrampolineLarge: true inBlock: InFullBlock called: 'ceLargeFullBlockContext']. LowcodeVM ifTrue: [ self generateLowcodeObjectTrampolines ]!
vm-dev@lists.squeakfoundation.org