[Vm-dev] VM Maker: VMMaker.oscog-eem.1248.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Apr 23 17:45:43 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1248.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1248
Author: eem
Time: 23 April 2015, 10:43:29.344 am
UUID: ec950a22-b488-4bba-9520-24174b51b5ca
Ancestors: VMMaker.oscog-cb.1247
Commentary, and one assert added to Clément's changes.
=============== Diff against VMMaker.oscog-cb.1247 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>genStorePop:LiteralVariable: (in category 'bytecode generator support') -----
genStorePop: popBoolean LiteralVariable: litVarIndex
<inline: false>
| topReg assocReg association |
+ "The only reason we assert needsFrame here is that in a frameless method
+ ReceiverResultReg must and does contain only self, but the ceStoreCheck
+ trampoline expects the target of the store to be in ReceiverResultReg. So
+ in a frameless method we would have a conflict between the receiver and
+ the literal store, unless we we smart enough to realise that ReceiverResultReg
+ was unused after the literal variable store, unlikely given that methods
+ return self by default."
+ self assert: needsFrame.
"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 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>>ssAllocateCallReg:and: (in category 'simulation stack') -----
ssAllocateCallReg: requiredReg1 and: requiredReg2
+ "Allocate registers needed in a run-time call (i.e. flush uses of the
+ registers to the real stack). Since the run-time can smash any and
+ all caller-saved registers also flush all caller-saved registers."
self ssAllocateRequiredRegMask: (callerSavedRegMask
bitOr: ((self registerMaskFor: requiredReg1)
bitOr: (self registerMaskFor: requiredReg2)))
upThrough: simStackPtr!
Item was changed:
----- Method: StackToRegisterMappingCogit>>ssAllocateCallReg:and:and: (in category 'simulation stack') -----
ssAllocateCallReg: requiredReg1 and: requiredReg2 and: requiredReg3
+ "Allocate registers needed in a run-time call (i.e. flush uses of the
+ registers to the real stack). Since the run-time can smash any and
+ all caller-saved registers also flush all caller-saved registers."
self ssAllocateRequiredRegMask: (callerSavedRegMask
bitOr: ((self registerMaskFor: requiredReg1)
bitOr: ((self registerMaskFor: requiredReg2)
bitOr: (self registerMaskFor: requiredReg3))))
upThrough: simStackPtr!
Item was changed:
----- Method: StackToRegisterMappingCogit>>ssAllocateCallReg:and:and:and: (in category 'simulation stack') -----
ssAllocateCallReg: requiredReg1 and: requiredReg2 and: requiredReg3 and: requiredReg4
+ "Allocate registers needed in a run-time call (i.e. flush uses of the
+ registers to the real stack). Since the run-time can smash any and
+ all caller-saved registers also flush all caller-saved registers."
self ssAllocateRequiredRegMask: (callerSavedRegMask
bitOr: ((self registerMaskFor: requiredReg1)
bitOr: ((self registerMaskFor: requiredReg2)
bitOr: ((self registerMaskFor: requiredReg3)
bitOr: (self registerMaskFor: requiredReg4)))))
upThrough: simStackPtr!
More information about the Vm-dev
mailing list