[Vm-dev] VM Maker: VMMaker.oscog-eem.2697.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Feb 3 02:37:24 UTC 2020
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2697.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2697
Author: eem
Time: 2 February 2020, 6:37:09.700472 pm
UUID: 981e806f-061b-4a48-8c03-ae9740125a88
Ancestors: VMMaker.oscog-eem.2696
Slang/Simulation: Allow the CoInterpreter to specify the clustering of variables so that those variables accessed via VarVaseReg can be placed in a convenient order starting at VarBaseReg.
=============== Diff against VMMaker.oscog-eem.2696 ===============
Item was changed:
----- Method: CCodeGeneratorGlobalStructure>>buildSortedVariablesCollection (in category 'C code generator') -----
buildSortedVariablesCollection
"Build sorted vars, end result will be sorted collection based on static usage,
perhaps cache lines will like this!!"
| globalNames |
globalNames := Bag new: globalVariableUsage size.
globalVariableUsage keysAndValuesDo:
[:k :v | | count |
count := 0.
v do:
[:methodName|
(methods at: methodName ifAbsent: []) ifNotNil:
[:method|
method parseTree nodesDo:
[:n|
(n isVariable
and: [n name hasEqualElements: k]) ifTrue:
[count := count + 1]]]].
globalNames
add: k "move arrays (e.g. methodCache) to end of struct"
withOccurrences: (((variableDeclarations at: k ifAbsent: ['']) includes: $[)
ifTrue: [count]
ifFalse: [count + 1000])].
variableDeclarations keysDo:
[:e | globalNames add: e withOccurrences: 0].
variables do:
[:e | globalNames add: e withOccurrences: 0].
+ "Allow vmClass to specify some number of names that should be emitted first in a specific order.
+ This is for the Cogit's use of VarBaseRegister."
+ ([vmClass clusteredVariableNames]
+ on: MessageNotUnderstood
+ do: [:ex| nil]) ifNotNil:
+ [:clusteredVariableNames|
+ clusteredVariableNames with: (clusteredVariableNames size - 1 * 10000 + 1000000 to: 1000000 by: -10000) do:
+ [:variable :occurrences|
+ (globalNames includes: variable) ifTrue:
+ [globalNames
+ remove: variable;
+ add: variable withOccurrences: occurrences]]].
^(globalNames sortedElements asSortedCollection:
[:a1 :a2| a1 value > a2 value or: [a1 value = a2 value and: [a1 key <= a2 key]]]) collect:
[:ea| ea key]!
Item was added:
+ ----- Method: CoInterpreter class>>clusteredVariableNames (in category 'translation') -----
+ clusteredVariableNames
+ "Insist that these variables are present early in the list of variables, and in this order,
+ so that e.g. they are conveniently accessed via the VarBaseReg if it is available."
+ ^#(stackPointer framePointer CStackPointer CFramePointer
+ primFailCode newMethod instructionPointer argumentCount nextProfileTick
+ nativeSP nativeStackPointer shadowCallStackPointer)!
Item was removed:
- ----- Method: CoInterpreter>>varBaseAddress (in category 'cog jit support') -----
- varBaseAddress
- <api>
- <returnTypeC: #usqInt>
- ^self cCode: [(self addressOf: stackPointer) asUnsignedInteger - 16r40]
- inSmalltalk: [cogit fakeVarBaseAddress]!
Item was changed:
----- Method: Cogit>>fakeAddressFor:index: (in category 'initialization') -----
fakeAddressFor: anObject index: index
"Answer a fake address for some variable based on some index.
The index will usually be the size of simulatedAddresses, but
in determining the varBaseAddress we take a guess at the final
size of simulatedAddresses."
<doNotGenerate>
+ ^index * objectMemory wordSize
+ + ((backEnd notNil
+ and: [backEnd wantsNearAddressFor: anObject])
+ ifTrue: [self addressSpaceMask - (1024 * 1024)]
+ ifFalse: [self allButTopBitOfAddressSpaceMask])!
- ^(index + 101 * objectMemory wordSize) negated
- bitAnd: ((backEnd notNil
- and: [backEnd wantsNearAddressFor: anObject])
- ifTrue: [self addressSpaceMask]
- ifFalse: [self allButTopBitOfAddressSpaceMask])!
Item was changed:
----- Method: Cogit>>fakeVarBaseAddress (in category 'accessing') -----
fakeVarBaseAddress
- "We expect simulatedAddresses to have around 40 entries. 48 is hopefully a good maximum."
<doNotGenerate>
+ ^simulatedAddresses at: #stackPointer!
- ^self fakeAddressFor: nil index: 48!
Item was changed:
----- Method: Cogit>>setInterpreter: (in category 'initialization') -----
setInterpreter: aCoInterpreter
"Initialization of the code generator in the simulator.
These objects already exist in the generated C VM
or are used only in the simulation."
<doNotGenerate>
coInterpreter := aCoInterpreter.
objectMemory := aCoInterpreter objectMemory.
threadManager := aCoInterpreter threadManager. "N.B. may be nil"
methodZone := self class methodZoneClass new.
objectRepresentation := objectMemory objectRepresentationClass
forCogit: self methodZone: methodZone.
methodZone setInterpreter: aCoInterpreter
objectRepresentation: objectRepresentation
cogit: self.
generatorTable := self class generatorTable.
processor := ProcessorClass new.
simulatedAddresses := Dictionary new.
+ coInterpreter class clusteredVariableNames do:
+ [:cvn| self simulatedAddressFor: (cvn first = $C ifTrue: ['get', cvn] ifFalse: [cvn]) asSymbol].
simulatedTrampolines := Dictionary new.
simulatedVariableGetters := Dictionary new.
simulatedVariableSetters := Dictionary new.
traceStores := 0.
traceFlags := (self class initializationOptions at: #recordPrimTrace ifAbsent: [true])
ifTrue: [8] "record prim trace on by default (see Cogit class>>decareCVarsIn:)"
ifFalse: [0].
debugPrimCallStackOffset := 0.
singleStep := printRegisters := printInstructions := clickConfirm := false.
backEnd := CogCompilerClass for: self.
methodLabel := CogCompilerClass for: self.
(literalsManager := backEnd class literalsManagerClass new) cogit: self.
ordinarySendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
superSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
BytecodeSetHasDirectedSuperSend ifTrue:
[directedSuperSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
directedSuperBindingSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
directedSendUsesBinding := false].
NewspeakVM ifTrue:
[selfSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
dynamicSuperSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
implicitReceiverSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines).
outerSendTrampolines := CArrayAccessor on: (Array new: NumSendTrampolines)].
"debug metadata"
objectReferencesInRuntime := CArrayAccessor on: (Array new: NumObjRefsInRuntime).
runtimeObjectRefIndex := 0.
"debug metadata"
trampolineAddresses := CArrayAccessor on: (Array new: NumTrampolines * 2).
trampolineTableIndex := 0.
extA := numExtB := extB := 0.
compilationTrace ifNil: [compilationTrace := self class initializationOptions at: #compilationTrace ifAbsent: [0]].
debugOpcodeIndices := self class initializationOptions at: #debugOpcodeIndices ifAbsent: [Set new].
debugBytecodePointers := self class initializationOptions at: #debugBytecodePointers ifAbsent: [Set new].
self class initializationOptions at: #breakPC ifPresent: [:pc| breakPC := pc]!
Item was changed:
----- Method: Cogit>>varBaseAddress (in category 'accessing') -----
varBaseAddress
+ ^coInterpreter stackPointerAddress!
- "This is for disassembly decoration by the processor aliens. they don't know aboud objectMemory hence forward..."
- <doNotGenerate>
- ^coInterpreter varBaseAddress!
Item was removed:
- ----- Method: CurrentImageCoInterpreterFacade>>varBaseAddress (in category 'accessing') -----
- varBaseAddress
- "This value is chosen for ARM, which has the ability to do 12-bit relative addresses from the var base register."
- ^(variables at: 'stackLimit') - (1 << 11)!
More information about the Vm-dev
mailing list