[Vm-dev] VM Maker: VMMaker.oscog-cb.1254.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Apr 25 12:54:52 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1254.mcz

==================== Summary ====================

Name: VMMaker.oscog-cb.1254
Author: cb
Time: 25 April 2015, 2:53:23.172 pm
UUID: 97025480-a775-439d-b087-6a5f4be3e7c7
Ancestors: VMMaker.oscog-tpr.1253

In genStorePop: popBoolean LiteralVariable: litVarIndex ; use allocateRequiredReg instead of allocateCallReg as the ceStoreCheckTrampoline generation takes already care of saving the register, including ReceiverResultReg, better.

In genStorePop: popBoolean MaybeContextReceiverVariable: slotIndex, fixed a comment

In genStorePop: popBoolean RemoteTemp: slotIndex At: remoteTempIndex, still need to allocate ReceiverResultReg (one of my recent fix remove allocateCallReg: instead of replacing it with allocateRequiredReg:) and move optStatus isReceiverResultRegLive: false in the branch where ReceiverReg is allocated only.

=============== Diff against VMMaker.oscog-tpr.1253 ===============

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 ].
  		
  	topReg := self allocateRegForStackTopEntryNotConflictingWith: (self registerMaskFor: ReceiverResultReg).
  	self ssStorePop: popBoolean toReg: topReg.
  	optStatus isReceiverResultRegLive: false.
+ 	self ssAllocateRequiredReg: ReceiverResultReg. "for ceStoreCheck call in genStoreSourceReg: has to be ReceiverResultReg"
- 	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:MaybeContextReceiverVariable: (in category 'bytecode generator support') -----
  genStorePop: popBoolean MaybeContextReceiverVariable: slotIndex
  	<inline: false>
  	| jmpSingle jmpDone valueReg |
  	<var: #jmpSingle type: #'AbstractInstruction *'>
  	<var: #jmpDone type: #'AbstractInstruction *'>
  	"The reason we need a frame here is that assigning to an inst var of a context may
  	 involve wholesale reorganization of stack pages, and the only way to preserve the
  	 execution state of an activation in that case is if it has a frame."
  	self assert: needsFrame.
  	self ssFlushUpThroughReceiverVariable: slotIndex.
  	"Note that ReceiverResultReg remains live after both
  	 ceStoreContextInstVarTrampoline and ceStoreCheckTrampoline."
  	self ensureReceiverResultRegContainsSelf.
  	self ssPop: 1.
+ 	self ssAllocateCallReg: ClassReg and: SendNumArgsReg. "for ceStoreContextInstVarTrampoline"
- 	self ssAllocateCallReg: ClassReg and: SendNumArgsReg. "for the ceStoreCheck call in genStoreSourceReg:... below"
  	self ssPush: 1.
  	objectRepresentation
  		genLoadSlot: SenderIndex
  		sourceReg: ReceiverResultReg
  		destReg: TempReg.
  	valueReg := self ssStorePop: popBoolean toPreferredReg: ClassReg.
  	valueReg ~= ClassReg ifTrue:
  		[self MoveR: valueReg R: ClassReg].
  	jmpSingle := objectRepresentation genJumpNotSmallIntegerInScratchReg: TempReg.
  	self MoveCq: slotIndex R: SendNumArgsReg.
  	self CallRT: ceStoreContextInstVarTrampoline.
  	jmpDone := self Jump: 0.
  	jmpSingle jmpTarget: self Label.
  	traceStores > 0 ifTrue:
  		[self MoveR: ClassReg R: TempReg.
  		 self CallRT: ceTraceStoreTrampoline].
  	objectRepresentation
  		genStoreSourceReg: ClassReg
  		slotIndex: slotIndex
  		destReg: ReceiverResultReg
  		scratchReg: TempReg
  		inFrame: true.
  	jmpDone jmpTarget: self Label.
  	^0!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genStorePop:RemoteTemp:At: (in category 'bytecode generator support') -----
  genStorePop: popBoolean RemoteTemp: slotIndex At: remoteTempIndex
  	<inline: false>
  	| topReg topSpilled tempVectReg |
  	"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 temote temp 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.
- 	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.
  		 traceStores > 0 ifTrue:
  			[ tempVectReg = ReceiverResultReg ifFalse: 
  					[ self ssAllocateRequiredReg: ReceiverResultReg.
  					optStatus isReceiverResultRegLive: false.
  					self MoveR: tempVectReg R: ReceiverResultReg ].
  			self CallRT: ceTraceStoreTrampoline].
  		 ^objectRepresentation
  			genStoreImmediateInSourceReg: TempReg
  			slotIndex: slotIndex
  			destReg: tempVectReg].
  	topReg := self allocateRegForStackTopEntryNotConflictingWith: (self registerMaskFor: ReceiverResultReg).
  	topSpilled := self ssTop spilled.
  	self ssStorePop: (popBoolean or: [topSpilled]) toReg: topReg.
  	popBoolean ifFalse:
  		[topSpilled ifFalse: [self ssPop: 1].
  		 self ssPushRegister: topReg].
+ 	self ssAllocateRequiredReg: ReceiverResultReg.
+ 	optStatus isReceiverResultRegLive: false.
  	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