[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