[Vm-dev] VM Maker: VMMaker.oscog-cb.1244.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Apr 23 09:38:08 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1244.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1244
Author: cb
Time: 23 April 2015, 11:36:22.065 am
UUID: f9bea40c-9a55-4113-8b12-49e6d23056e2
Ancestors: VMMaker.oscog-cb.1243
Changed #genStorePop: popBoolean LiteralVariable: litVarIndex so it uses register allocation instead of ReceiverResultReg and ClassReg.
This method now does not require a frame if the assigned value is an unannotatableConstant. However, it still needs a frame in the other case due to the ceStoreCheck.
=============== Diff against VMMaker.oscog-cb.1243 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegForStackEntryAt: (in category 'simulation stack') -----
allocateRegForStackEntryAt: index
<inline: true>
+ ^ self allocateRegForStackEntryAt: index notConflictingWith: 0
- <var: #stackEntry type: #'CogSimStackEntry *'>
- | stackEntry |
- stackEntry := self ssValue: index.
- stackEntry type = SSRegister ifTrue: [ ^ stackEntry register].
- ^ self allocateAnyReg
!
Item was added:
+ ----- Method: StackToRegisterMappingCogit>>allocateRegForStackEntryAt:notConflictingWith: (in category 'simulation stack') -----
+ allocateRegForStackEntryAt: index notConflictingWith: regMask
+ <var: #stackEntry type: #'CogSimStackEntry *'>
+ | stackEntry |
+ stackEntry := self ssValue: index.
+ (stackEntry type = SSRegister and: [ (self register: stackEntry register isInMask: regMask) not ]) ifTrue:
+ [ ^ stackEntry register].
+ ^ self allocateRegNotConflictingWith: regMask
+ !
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopEntry (in category 'simulation stack') -----
allocateRegForStackTopEntry
+ <inline: true>
^ self allocateRegForStackEntryAt: 0
!
Item was added:
+ ----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopEntryNotConflictingWith: (in category 'simulation stack') -----
+ allocateRegForStackTopEntryNotConflictingWith: regMask
+ <inline: true>
+ ^ self allocateRegForStackEntryAt: 0 notConflictingWith: regMask
+ !
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopTwoEntriesInto: (in category 'simulation stack') -----
allocateRegForStackTopTwoEntriesInto: binaryBlock
<inline: true>
| topRegistersMask rTop rNext |
topRegistersMask := 0.
self ssTop type = SSRegister ifTrue:
+ [ rTop := self ssTop register].
- [ topRegistersMask := self registerMaskFor: (rTop := self ssTop register)].
(self ssValue: 1) type = SSRegister ifTrue:
+ [ topRegistersMask := self registerMaskFor: (rNext := (self ssValue: 1) register)].
- [ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rNext := (self ssValue: 1) register))].
rTop ifNil: [ rTop := self allocateRegNotConflictingWith: topRegistersMask ].
rNext ifNil: [ rNext := self allocateRegNotConflictingWith: (self registerMaskFor: rTop) ].
^ binaryBlock value: rTop value: rNext
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genStorePop:LiteralVariable: (in category 'bytecode generator support') -----
genStorePop: popBoolean LiteralVariable: litVarIndex
<inline: false>
+ | topReg assocReg association |
- | topReg valueReg association |
- self flag: 'with better register allocation this wouldn''t need a frame. e.g. use SendNumArgs instead of ReceiverResultReg'.
- self assert: needsFrame.
- optStatus isReceiverResultRegLive: false.
"N.B. No need to check the stack for references because we generate code for
literal variable loads that stores the result in a register, deferring only the register push."
association := self getLiteral: litVarIndex.
+
"Avoid store check for immediate values"
+ (objectRepresentation isUnannotatableConstant: self ssTop)
+ ifTrue:
+ [ assocReg := self allocateAnyReg.
+ self genMoveConstant: association R: assocReg.
+ objectRepresentation
+ genEnsureObjInRegNotForwarded: assocReg
+ scratchReg: TempReg.
+ self ssStorePop: popBoolean toReg: TempReg.
+ traceStores > 0 ifTrue:
+ [ assocReg = ReceiverResultReg ifFalse:
+ [ self ssAllocateRequiredReg: ReceiverResultReg.
+ optStatus isReceiverResultRegLive: false.
+ self MoveR: assocReg R: ReceiverResultReg ].
+ self CallRT: ceTraceStoreTrampoline].
+ ^objectRepresentation
+ genStoreImmediateInSourceReg: TempReg
+ slotIndex: ValueIndex
+ destReg: assocReg ]
+ ifFalse: [ self assert: needsFrame. "because ReceiverResult reg is used for storeCheckTrampoline" ].
+
+
+ topReg := self allocateRegForStackTopEntryNotConflictingWith: (self registerMaskFor: ReceiverResultReg).
- (objectRepresentation isUnannotatableConstant: self ssTop) ifTrue:
- [self ssAllocateRequiredReg: ReceiverResultReg.
- self genMoveConstant: association R: ReceiverResultReg.
- objectRepresentation
- genEnsureObjInRegNotForwarded: ReceiverResultReg
- scratchReg: TempReg.
- self ssStorePop: popBoolean toPreferredReg: TempReg.
- traceStores > 0 ifTrue:
- [self CallRT: ceTraceStoreTrampoline].
- ^objectRepresentation
- genStoreImmediateInSourceReg: TempReg
- slotIndex: ValueIndex
- destReg: ReceiverResultReg].
- ((topReg := self ssTop registerOrNil) isNil
- or: [topReg = ReceiverResultReg]) ifTrue:
- [topReg := ClassReg].
self ssPop: 1.
self ssAllocateCallReg: topReg. "for the ceStoreCheck call in genStoreSourceReg:... below"
self ssPush: 1.
+ self ssStorePop: popBoolean toReg: topReg.
+ optStatus isReceiverResultRegLive: false.
+ self ssAllocateCallReg: ReceiverResultReg. "for ceStoreCheck call in genStoreSourceReg: has to be ReceiverResultReg"
+ self genMoveConstant: association R: ReceiverResultReg.
- valueReg := self ssStorePop: popBoolean toPreferredReg: topReg.
- valueReg = ReceiverResultReg ifTrue:
- [self MoveR: valueReg R: topReg].
- self ssAllocateCallReg: ReceiverResultReg.
- self annotate: (self MoveCw: association R: ReceiverResultReg) objRef: association.
objectRepresentation genEnsureObjInRegNotForwarded: ReceiverResultReg scratchReg: TempReg.
traceStores > 0 ifTrue:
[self MoveR: topReg R: TempReg.
self CallRT: ceTraceStoreTrampoline].
^objectRepresentation
genStoreSourceReg: topReg
slotIndex: ValueIndex
destReg: ReceiverResultReg
scratchReg: TempReg
inFrame: needsFrame!
Item was changed:
----- Method: StackToRegisterMappingCogit>>ssStorePop:toPreferredReg: (in category 'simulation stack') -----
ssStorePop: popBoolean toPreferredReg: preferredReg
"Store or pop the top simulated stack entry to a register.
+ Use preferredReg if the entry is not itself a register.
- Pop to preferredReg if the entry is not itself a register.
Answer the actual register the result ends up in."
| actualReg |
actualReg := preferredReg.
+ self ssTop type = SSRegister ifTrue:
+ [ self assert: self ssTop annotateUse not.
+ self assert: self ssTop spilled not.
+ actualReg := self ssTop register].
+ self ssStorePop: popBoolean toReg: actualReg. "generates nothing if ssTop is already in actualReg"
+ ^ actualReg!
- popBoolean
- ifTrue: [(self ssTop type = SSRegister "and: [self ssTop spilled not]")
- ifTrue: [self assert: self ssTop spilled not.
- self assert: self ssTop annotateUse not.
- actualReg := self ssTop register]
- ifFalse: [self ssTop popToReg: preferredReg].
- self ssPop: 1]
- ifFalse: [self ssTop type = SSRegister
- ifTrue: [self assert: self ssTop annotateUse not.
- actualReg := self ssTop register]
- ifFalse: [self ssTop storeToReg: preferredReg]].
- ^actualReg!
Item was added:
+ ----- Method: StackToRegisterMappingCogit>>ssStorePop:toReg: (in category 'simulation stack') -----
+ ssStorePop: popBoolean toReg: reg
+ "Store or pop the top simulated stack entry to a register.
+ N.B.: popToReg: and storeToReg: does not generate anything if
+ it moves a register to the same register."
+ popBoolean
+ ifTrue: [self ssTop popToReg: reg.
+ self ssPop: 1]
+ ifFalse: [self ssTop storeToReg: reg].!
More information about the Vm-dev
mailing list