Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1753.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1753 Author: eem Time: 1 January 1970, 12:22:37.951321 pm UUID: c2577253-d843-4791-871d-f5e8ba2106b9 Ancestors: VMMaker.oscog-cb.1752
Make VMMaker.oscog-cb.1752's changes compilable.
Add a class var to hold the number of store trampolines; use 5 trampolines. Initialize the table for simulation in generateObjectRepresentationTrampolines. Declare ceStoreTrampolines conditionally depending on IMMUTABILITY. Avoid an extra register load in the store trampoline generator.
=============== Diff against VMMaker.oscog-cb.1752 ===============
Item was changed: ----- Method: CogObjectRepresentation class>>numTrampolines (in category 'accessing') ----- numTrampolines + ^1 "ceStoreCheckTrampoline"! - ^1!
Item was changed: CogObjectRepresentation subclass: #CogObjectRepresentationForSpur instanceVariableNames: 'ceScheduleScavengeTrampoline ceSmallActiveContextInMethodTrampoline ceSmallActiveContextInBlockTrampoline ceLargeActiveContextInMethodTrampoline ceLargeActiveContextInBlockTrampoline ceStoreCheckContextReceiverTrampoline ceStoreTrampolines' + classVariableNames: 'NumStoreTrampolines' - classVariableNames: '' poolDictionaries: 'VMBytecodeConstants VMSqueakClassIndices' category: 'VMMaker-JIT'!
Item was added: + ----- Method: CogObjectRepresentationForSpur class>>declareCVarsIn: (in category 'translation') ----- + declareCVarsIn: aCodeGen + aCodeGen + var: #ceStoreTrampolines + declareC: ('#if IMMUTABILITY\sqInt ceStoreTrampolines[', NumStoreTrampolines printString, '];#endif') withCRs!
Item was added: + ----- Method: CogObjectRepresentationForSpur class>>initialize (in category 'class initialization') ----- + initialize + "Number of trampolines for the combined IMMUTABILITY/store check instance variable store. + Trampolines from 0 to NumStoreTrampolines - 2 are dedicated to an inst var index, the last one is generic." + NumStoreTrampolines := 5!
Item was changed: ----- Method: CogObjectRepresentationForSpur class>>numTrampolines (in category 'accessing') ----- numTrampolines + ^super numTrampolines + + 6 "(small,large)x(method,block) context creation, ceStoreCheckContextReceiverTrampoline and ceScheduleScavengeTrampoline" + + ((initializationOptions at: #IMMUTABILITY ifAbsent: [false]) + ifTrue: [NumStoreTrampolines] + ifFalse: [0])! - (initializationOptions at: #IMMUTABILITY ifAbsent: [false]) - ifTrue: [ ^ super numTrampolines + self new numStoreTrampolines + 7 ] - ifFalse: [ ^ super numTrampolines + 6 ]!
Item was changed: ----- Method: CogObjectRepresentationForSpur>>genStoreTrampolineCall: (in category 'compile abstract instructions') ----- genStoreTrampolineCall: instVarIndex <inline: true> + instVarIndex >= (NumStoreTrampolines - 1) - instVarIndex < self numStoreTrampolines - ifFalse: - [ cogit MoveCq: instVarIndex R: TempReg. - cogit CallRT: (ceStoreTrampolines at: self numStoreTrampolines) ] ifTrue: + [ cogit MoveCq: instVarIndex R: TempReg. + cogit CallRT: (ceStoreTrampolines at: NumStoreTrampolines - 1) ] + ifFalse: [ cogit CallRT: (ceStoreTrampolines at: instVarIndex) ]. cogit annotateBytecode: cogit Label!
Item was changed: ----- Method: CogObjectRepresentationForSpur>>genStoreTrampolineCalled:instVarIndex: (in category 'initialization') ----- genStoreTrampolineCalled: trampolineName instVarIndex: instVarIndex "Convention: - RcvrResultReg holds the object mutated. If immutability failure: - TempReg holds the instance variable index mutated if instVarIndex > numDedicatedStoreTrampoline - ClassReg holds the value to store Registers are not lived across this trampoline as the immutability failure may need new stack frames." | jumpSC | <option: #IMMUTABILITY> <var: #trampolineName type: #'char *'> <var: #jumpSC type: #'AbstractInstruction *'> <inline: false> cogit zeroOpcodeIndex. + "SendNumArgsReg is mutated but we don't care as register are not live across the trampoline. + There is no reason why registers cannot be saved over the remember: call, but since the + immutability check is a suspension point, registers cannot remain live." + jumpSC := self genJumpMutable: ReceiverResultReg scratchReg: SendNumArgsReg. - jumpSC := self genJumpMutable: ReceiverResultReg scratchReg: SendNumArgsReg. "SendNumArgsReg is mutated but we don't care as register are not live across the trampoline" - instVarIndex = self numStoreTrampolines - ifFalse: [ cogit MoveCq: instVarIndex R: TempReg ]. cogit compileTrampolineFor: #ceCannotAssignTo:withIndex:valueToAssign: numArgs: 3 arg: ReceiverResultReg + arg: (instVarIndex < (NumStoreTrampolines - 1) + ifTrue: [cogit trampolineArgConstant: instVarIndex] + ifFalse: [TempReg]) - arg: TempReg arg: ClassReg arg: nil regsToSave: cogit emptyRegisterMask pushLinkReg: true resultReg: NoReg. "Store check" jumpSC jmpTarget: cogit Label. ^ cogit genTrampolineFor: #remember: called: trampolineName numArgs: 1 arg: ReceiverResultReg arg: nil arg: nil arg: nil regsToSave: cogit emptyRegisterMask pushLinkReg: true resultReg: NoReg appendOpcodes: true!
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." self cppIf: IMMUTABILITY ifTrue: + [self cCode: [] inSmalltalk: + [ceStoreTrampolines := CArrayAccessor on: (Array new: NumStoreTrampolines)]. + 0 to: NumStoreTrampolines - 1 do: + [:instVarIndex | + ceStoreTrampolines + at: instVarIndex + put: (self - [ 0 to: self numStoreTrampolines do: - [ :instVarIndex | - ceStoreTrampolines - at: instVarIndex - put: (self genStoreTrampolineCalled: (cogit + trampolineName: 'ceStoreTrampoline' + numArgs: instVarIndex + limit: NumStoreTrampolines - 2) + instVarIndex: instVarIndex)]]. - trampolineName: 'ceStoreTrampoline' - numArgs: instVarIndex - limit: self numStoreTrampolines - 1) - instVarIndex: instVarIndex ) ] ]. ceStoreCheckTrampoline := cogit genTrampolineFor: #remember: called: 'ceStoreCheckTrampoline' arg: ReceiverResultReg regsToSave: (cogit callerSavedRegMask bitClear: (cogit registerMaskFor: ReceiverResultReg)) result: cogit returnRegForStoreCheck. ceStoreCheckContextReceiverTrampoline := self genStoreCheckContextReceiverTrampoline. ceScheduleScavengeTrampoline := cogit genTrampolineFor: #ceScheduleScavenge called: 'ceScheduleScavengeTrampoline' regsToSave: cogit callerSavedRegMask. ceSmallActiveContextInMethodTrampoline := self genActiveContextTrampolineLarge: false inBlock: false called: 'ceSmallMethodContext'. ceSmallActiveContextInBlockTrampoline := self genActiveContextTrampolineLarge: false inBlock: true called: 'ceSmallBlockContext'. ceLargeActiveContextInMethodTrampoline := self genActiveContextTrampolineLarge: true inBlock: false called: 'ceLargeMethodContext'. ceLargeActiveContextInBlockTrampoline := self genActiveContextTrampolineLarge: true inBlock: true called: 'ceLargeBlockContext'!
Item was removed: - ----- Method: CogObjectRepresentationForSpur>>numStoreTrampolines (in category 'initialization') ----- - numStoreTrampolines - "Number of trampolines for instance variable store. Trampolines from 0 to - numStoreTrampoline - 1 are dedicated to an inst var index, the last one is generic. - - WARNING: Check the C declaration of ceStoreTrampolines if this number is increased." - ^ 3!
Item was removed: - ----- Method: CogObjectRepresentationForSpur>>setCogit:methodZone: (in category 'in-line cacheing') ----- - setCogit: aCogit methodZone: aMethodZone - <doNotGenerate> - super setCogit: aCogit methodZone: aMethodZone. - ceStoreTrampolines := CArrayAccessor on: (Array new: self numStoreTrampolines + 1).!
Item was changed: ----- Method: StackToRegisterMappingCogit class>>declareCVarsIn: (in category 'translation') ----- declareCVarsIn: aCodeGen aCodeGen - var: #ceStoreTrampolines - declareC: 'sqint ceStoreTrampolines[4]'; var: #methodAbortTrampolines declareC: 'sqInt methodAbortTrampolines[4]'; var: #picAbortTrampolines declareC: 'sqInt picAbortTrampolines[4]'; var: #picMissTrampolines declareC: 'sqInt picMissTrampolines[4]'; var: 'ceCall0ArgsPIC' declareC: 'void (*ceCall0ArgsPIC)(void)'; var: 'ceCall1ArgsPIC' declareC: 'void (*ceCall1ArgsPIC)(void)'; var: 'ceCall2ArgsPIC' declareC: 'void (*ceCall2ArgsPIC)(void)'; var: #ceCallCogCodePopReceiverArg0Regs declareC: 'void (*ceCallCogCodePopReceiverArg0Regs)(void)'; var: #realCECallCogCodePopReceiverArg0Regs declareC: 'void (*realCECallCogCodePopReceiverArg0Regs)(void)'; var: #ceCallCogCodePopReceiverArg1Arg0Regs declareC: 'void (*ceCallCogCodePopReceiverArg1Arg0Regs)(void)'; var: #realCECallCogCodePopReceiverArg1Arg0Regs declareC: 'void (*realCECallCogCodePopReceiverArg1Arg0Regs)(void)'; var: 'simStack' declareC: 'CogSimStackEntry simStack[', ((CoInterpreter bindingOf: #LargeContextSlots) value * 5 // 4) asString, ']'; var: 'simSelf' type: #CogSimStackEntry; var: #optStatus type: #CogSSOptStatus; var: 'prevBCDescriptor' type: #'BytecodeDescriptor *'.
self numPushNilsFunction ifNotNil: [aCodeGen var: 'numPushNilsFunction' declareC: 'sqInt (* const numPushNilsFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = ', (aCodeGen cFunctionNameFor: self numPushNilsFunction); var: 'pushNilSizeFunction' declareC: 'sqInt (* const pushNilSizeFunction)(sqInt,sqInt) = ', (aCodeGen cFunctionNameFor: self pushNilSizeFunction)].
aCodeGen addSelectorTranslation: #register to: (aCodeGen cFunctionNameFor: 'registerr'); addSelectorTranslation: #register: to: (aCodeGen cFunctionNameFor: 'registerr:')!
vm-dev@lists.squeakfoundation.org