[Vm-dev] VM Maker: VMMaker.oscog-cb.1246.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Apr 23 11:58:06 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1246.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1246
Author: cb
Time: 23 April 2015, 1:56:41.665 pm
UUID: 94149f1f-8fa4-4899-84c6-091fcb539bf7
Ancestors: VMMaker.oscog-cb.1245
Refactored storePop methods to use register allocation.
I believe that now #genStorePop: popBoolean LiteralVariable: litVarIndex can be frameless but I am confused on how to handle ReceiverResultReg. I need to discuss with Eliot about it.
=============== Diff against VMMaker.oscog-cb.1245 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopThreeEntriesInto:thirdIsReceiver: (in category 'simulation stack') -----
allocateRegForStackTopThreeEntriesInto: trinaryBlock thirdIsReceiver: thirdIsReceiver
<inline: true>
| topRegistersMask rTop rNext rThird |
topRegistersMask := 0.
(self ssTop type = SSRegister and: [ thirdIsReceiver not or: [ self ssTop register ~= ReceiverResultReg ] ]) ifTrue:
[ topRegistersMask := self registerMaskFor: (rTop := self ssTop register)].
((self ssValue: 1) type = SSRegister and: [ thirdIsReceiver not or: [ (self ssValue: 1) register ~= ReceiverResultReg ] ]) ifTrue:
[ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rNext := (self ssValue: 1) register))].
((self ssValue: 2) type = SSRegister and: [thirdIsReceiver not or: [ (self ssValue: 2) register = ReceiverResultReg ] ]) ifTrue:
[ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rThird := (self ssValue: 2) register))].
rThird ifNil:
[ thirdIsReceiver
ifTrue:
[ rThird := ReceiverResultReg. "Free ReceiverResultReg if it was not free"
+ self ssAllocateRequiredReg: ReceiverResultReg.
- (self register: ReceiverResultReg isInMask: self liveRegisters) ifTrue:
- [ self ssAllocateRequiredReg: ReceiverResultReg ].
optStatus isReceiverResultRegLive: false ]
ifFalse: [ rThird := self allocateRegNotConflictingWith: topRegistersMask ].
topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: rThird) ].
rTop ifNil: [
rTop := self allocateRegNotConflictingWith: topRegistersMask.
topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: rTop) ].
rNext ifNil: [ rNext := self allocateRegNotConflictingWith: topRegistersMask ].
^ trinaryBlock value: rTop value: rNext value: rThird
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>freeAnyRegNotConflictingWith: (in category 'simulation stack') -----
freeAnyRegNotConflictingWith: regMask
"Spill the closest register on stack not conflicting with regMask.
Assertion Failure if regMask has already all the registers"
<var: #desc type: #'CogSimStackEntry *'>
| reg index |
+ self assert: needsFrame.
index := simSpillBase max: 0.
[reg isNil and: [index < simStackPtr] ] whileTrue:
[ | desc |
desc := self simStackAt: index.
desc type = SSRegister ifTrue:
[ (regMask anyMask: (self registerMaskFor: desc register)) ifFalse:
[ reg := desc register ] ].
index := index + 1].
self assert: reg notNil.
self ssAllocateRequiredReg: reg.
^reg!
Item was removed:
- ----- Method: StackToRegisterMappingCogit>>genFramelessStorePop:ReceiverVariable: (in category 'bytecode generator support') -----
- genFramelessStorePop: popBoolean ReceiverVariable: slotIndex
- <inline: false>
- | topReg valueReg |
- self assert: needsFrame not.
- self ssFlushUpThroughReceiverVariable: slotIndex.
- "Avoid store check for immediate values"
- (objectRepresentation isUnannotatableConstant: self ssTop) ifTrue:
- [self ensureReceiverResultRegContainsSelf.
- self ssStorePop: popBoolean toPreferredReg: TempReg.
- traceStores > 0 ifTrue:
- [backEnd saveAndRestoreLinkRegAround:
- [self CallRT: ceTraceStoreTrampoline]].
- ^objectRepresentation
- genStoreImmediateInSourceReg: TempReg
- slotIndex: slotIndex
- destReg: ReceiverResultReg].
- (topReg := self ssTop registerOrNil) isNil ifTrue:
- [topReg := ClassReg].
- valueReg := self ssStorePop: popBoolean toPreferredReg: topReg.
- "Note that ReceiverResultReg remains live after ceStoreCheckTrampoline."
- self ensureReceiverResultRegContainsSelf.
- traceStores > 0 ifTrue:
- [self MoveR: valueReg R: TempReg.
- backEnd saveAndRestoreLinkRegAround:
- [self CallRT: ceTraceStoreTrampoline]].
- ^objectRepresentation
- genStoreSourceReg: valueReg
- slotIndex: slotIndex
- destReg: ReceiverResultReg
- scratchReg: TempReg
- inFrame: false!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genStorePop:LiteralVariable: (in category 'bytecode generator support') -----
genStorePop: popBoolean LiteralVariable: litVarIndex
<inline: false>
| topReg assocReg association |
"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).
- 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.
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>>genStorePop:ReceiverVariable: (in category 'bytecode generator support') -----
genStorePop: popBoolean ReceiverVariable: slotIndex
<inline: false>
+ ^ needsFrame
+ ifFalse:
+ [ self
+ genStorePop: popBoolean
+ ReceiverVariable: slotIndex
+ traceBlock: [ backEnd saveAndRestoreLinkRegAround: [self CallRT: ceTraceStoreTrampoline] ] ]
+ ifTrue:
+ [ self
+ genStorePop: popBoolean
+ ReceiverVariable: slotIndex
+ traceBlock: [ self CallRT: ceTraceStoreTrampoline ] ]!
- | topReg valueReg |
- needsFrame ifFalse:
- [^self genFramelessStorePop: popBoolean ReceiverVariable: slotIndex].
- self ssFlushUpThroughReceiverVariable: slotIndex.
- "Avoid store check for immediate values"
- (objectRepresentation isUnannotatableConstant: self ssTop) ifTrue:
- [self ensureReceiverResultRegContainsSelf.
- self ssStorePop: popBoolean toPreferredReg: TempReg.
- traceStores > 0 ifTrue:
- [self CallRT: ceTraceStoreTrampoline].
- ^objectRepresentation
- genStoreImmediateInSourceReg: TempReg
- slotIndex: slotIndex
- 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.
- valueReg := self ssStorePop: popBoolean toPreferredReg: topReg.
- valueReg = ReceiverResultReg ifTrue:
- [self MoveR: valueReg R: topReg].
- "Note that ReceiverResultReg remains live after ceStoreCheckTrampoline."
- self ensureReceiverResultRegContainsSelf.
- traceStores > 0 ifTrue:
- [self MoveR: topReg R: TempReg.
- self CallRT: ceTraceStoreTrampoline].
- ^objectRepresentation
- genStoreSourceReg: topReg
- slotIndex: slotIndex
- destReg: ReceiverResultReg
- scratchReg: TempReg
- inFrame: true!
Item was added:
+ ----- Method: StackToRegisterMappingCogit>>genStorePop:ReceiverVariable:traceBlock: (in category 'bytecode generator support') -----
+ genStorePop: popBoolean ReceiverVariable: slotIndex traceBlock: block
+ <inline: true>
+ | topReg |
+ self ssFlushUpThroughReceiverVariable: slotIndex.
+ "Avoid store check for immediate values"
+ (objectRepresentation isUnannotatableConstant: self ssTop) ifTrue:
+ [self ensureReceiverResultRegContainsSelf.
+ self ssStorePop: popBoolean toReg: TempReg.
+ traceStores > 0 ifTrue: [block value].
+ ^objectRepresentation
+ genStoreImmediateInSourceReg: TempReg
+ slotIndex: slotIndex
+ destReg: ReceiverResultReg].
+ topReg := self allocateRegForStackTopEntryNotConflictingWith: (self registerMaskFor: ReceiverResultReg).
+ self ssStorePop: popBoolean toReg: topReg.
+ "Note that ReceiverResultReg remains live after ceStoreCheckTrampoline."
+ self ensureReceiverResultRegContainsSelf.
+ traceStores > 0 ifTrue:
+ [self MoveR: topReg R: TempReg.
+ block value].
+ ^objectRepresentation
+ genStoreSourceReg: topReg
+ slotIndex: slotIndex
+ destReg: ReceiverResultReg
+ scratchReg: TempReg
+ inFrame: true!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genStorePop:RemoteTemp:At: (in category 'bytecode generator support') -----
genStorePop: popBoolean RemoteTemp: slotIndex At: remoteTempIndex
<inline: false>
+ | topReg topSpilled tempVectReg |
- | topReg valueReg topSpilled |
self assert: needsFrame.
optStatus isReceiverResultRegLive: false.
"N.B. No need to check the stack for references because we generate code for
remote temp loads that stores the result in a register, deferring only the register push."
"Avoid store check for immediate values"
(objectRepresentation isUnannotatableConstant: self ssTop) ifTrue:
+ [ tempVectReg := self allocateAnyReg.
+ self MoveMw: (self frameOffsetOfTemporary: remoteTempIndex) r: FPReg R: tempVectReg.
+ self ssStorePop: popBoolean toReg: TempReg.
- [self ssAllocateRequiredReg: ReceiverResultReg.
- self MoveMw: (self frameOffsetOfTemporary: remoteTempIndex) r: FPReg R: ReceiverResultReg.
- self ssStorePop: popBoolean toPreferredReg: TempReg.
traceStores > 0 ifTrue:
+ [ tempVectReg = ReceiverResultReg ifFalse:
+ [ self ssAllocateRequiredReg: ReceiverResultReg.
+ optStatus isReceiverResultRegLive: false.
+ self MoveR: tempVectReg R: ReceiverResultReg ].
+ self CallRT: ceTraceStoreTrampoline].
- [self CallRT: ceTraceStoreTrampoline].
^objectRepresentation
genStoreImmediateInSourceReg: TempReg
slotIndex: slotIndex
+ destReg: tempVectReg].
+ topReg := self allocateRegForStackTopEntryNotConflictingWith: (self registerMaskFor: ReceiverResultReg).
- destReg: ReceiverResultReg].
- ((topReg := self ssTop registerOrNil) isNil
- or: [topReg = ReceiverResultReg]) ifTrue:
- [topReg := ClassReg].
self ssPop: 1.
"for the ceStoreCheck call in genStoreSourceReg:... below"
self ssAllocateCallReg: topReg and: ReceiverResultReg.
self ssPush: 1.
topSpilled := self ssTop spilled.
+ self ssStorePop: (popBoolean or: [topSpilled]) toReg: topReg.
- valueReg := self ssStorePop: (popBoolean or: [topSpilled]) toPreferredReg: topReg.
- valueReg = ReceiverResultReg ifTrue:
- [self MoveR: valueReg R: topReg].
popBoolean ifFalse:
[topSpilled ifFalse: [self ssPop: 1].
self ssPushRegister: topReg].
self MoveMw: (self frameOffsetOfTemporary: remoteTempIndex) r: FPReg R: ReceiverResultReg.
traceStores > 0 ifTrue:
[self MoveR: topReg R: TempReg.
self CallRT: ceTraceStoreTrampoline].
^objectRepresentation
genStoreSourceReg: topReg
slotIndex: slotIndex
destReg: ReceiverResultReg
scratchReg: TempReg
inFrame: needsFrame!
More information about the Vm-dev
mailing list