[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