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

commits at source.squeak.org commits at source.squeak.org
Thu Apr 23 09:38:08 UTC 2015


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

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

Name: VMMaker.oscog-cb.1244
Author: cb
Time: 23 April 2015, 11:36:22.065 am
UUID: f9bea40c-9a55-4113-8b12-49e6d23056e2
Ancestors: VMMaker.oscog-cb.1243

Changed #genStorePop: popBoolean LiteralVariable: litVarIndex so it uses register allocation instead of ReceiverResultReg and ClassReg.

This method now does not require a frame if the assigned value is an unannotatableConstant. However, it still needs a frame in the other case due to the ceStoreCheck.

=============== Diff against VMMaker.oscog-cb.1243 ===============

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegForStackEntryAt: (in category 'simulation stack') -----
  allocateRegForStackEntryAt: index
  	<inline: true>
+ 	^ self allocateRegForStackEntryAt: index notConflictingWith: 0
- 	<var: #stackEntry type: #'CogSimStackEntry *'>
- 	| stackEntry |
- 	stackEntry := self ssValue: index.
- 	stackEntry type = SSRegister ifTrue: [ ^ stackEntry register].
- 	^ self allocateAnyReg
  	!

Item was added:
+ ----- Method: StackToRegisterMappingCogit>>allocateRegForStackEntryAt:notConflictingWith: (in category 'simulation stack') -----
+ allocateRegForStackEntryAt: index notConflictingWith: regMask
+ 	<var: #stackEntry type: #'CogSimStackEntry *'>
+ 	| stackEntry |
+ 	stackEntry := self ssValue: index.
+ 	(stackEntry type = SSRegister and: [ (self register: stackEntry register isInMask: regMask) not ]) ifTrue: 
+ 		[ ^ stackEntry register].
+ 	^ self allocateRegNotConflictingWith: regMask
+ 	!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopEntry (in category 'simulation stack') -----
  allocateRegForStackTopEntry
+ 	<inline: true>
  	^ self allocateRegForStackEntryAt: 0
  	!

Item was added:
+ ----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopEntryNotConflictingWith: (in category 'simulation stack') -----
+ allocateRegForStackTopEntryNotConflictingWith: regMask	
+ 	<inline: true>
+ 	^ self allocateRegForStackEntryAt: 0 notConflictingWith: regMask
+ 	!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegForStackTopTwoEntriesInto: (in category 'simulation stack') -----
  allocateRegForStackTopTwoEntriesInto: binaryBlock
  	<inline: true>
  	| topRegistersMask rTop rNext |
  	
  	topRegistersMask := 0.
  	
  	self ssTop type = SSRegister ifTrue: 
+ 		[ rTop := self ssTop register].
- 		[ topRegistersMask := self registerMaskFor: (rTop := self ssTop register)].
  	(self ssValue: 1) type = SSRegister ifTrue: 
+ 		[ topRegistersMask := self registerMaskFor: (rNext := (self ssValue: 1) register)].
- 		[ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rNext := (self ssValue: 1) register))].
  	
  	rTop ifNil: [ rTop := self allocateRegNotConflictingWith: topRegistersMask ].
  	
  	rNext ifNil: [ rNext := self allocateRegNotConflictingWith: (self registerMaskFor: rTop) ].
  	
  	^ binaryBlock value: rTop value: rNext
  	
  	!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genStorePop:LiteralVariable: (in category 'bytecode generator support') -----
  genStorePop: popBoolean LiteralVariable: litVarIndex
  	<inline: false>
+ 	| topReg assocReg association |
- 	| topReg valueReg association |
- 	self flag: 'with better register allocation this wouldn''t need a frame.  e.g. use SendNumArgs instead of ReceiverResultReg'.
- 	self assert: needsFrame.
- 	optStatus isReceiverResultRegLive: false.
  	"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).
- 	(objectRepresentation isUnannotatableConstant: self ssTop) ifTrue:
- 		[self ssAllocateRequiredReg: ReceiverResultReg.
- 		self genMoveConstant: association R: ReceiverResultReg.
- 		 objectRepresentation
- 			genEnsureObjInRegNotForwarded: ReceiverResultReg
- 			scratchReg: TempReg.
- 		 self ssStorePop: popBoolean toPreferredReg: TempReg.
- 		 traceStores > 0 ifTrue:
- 			[self CallRT: ceTraceStoreTrampoline].
- 		 ^objectRepresentation
- 			genStoreImmediateInSourceReg: TempReg
- 			slotIndex: ValueIndex
- 			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.
+ 	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.
- 	valueReg := self ssStorePop: popBoolean toPreferredReg: topReg.
- 	valueReg = ReceiverResultReg ifTrue:
- 		[self MoveR: valueReg R: topReg].
- 	self ssAllocateCallReg: ReceiverResultReg.
- 	self annotate: (self MoveCw: association R: ReceiverResultReg) objRef: association.
  	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>>ssStorePop:toPreferredReg: (in category 'simulation stack') -----
  ssStorePop: popBoolean toPreferredReg: preferredReg
  	"Store or pop the top simulated stack entry to a register.
+ 	 Use preferredReg if the entry is not itself a register.
- 	 Pop to preferredReg if the entry is not itself a register.
  	 Answer the actual register the result ends up in."
  	| actualReg |
  	actualReg := preferredReg.
+ 	self ssTop type = SSRegister ifTrue: 
+ 		[ self assert: self ssTop annotateUse not.
+ 		self assert: self ssTop spilled not.
+ 		actualReg := self ssTop register].
+ 	self ssStorePop: popBoolean toReg: actualReg. "generates nothing if ssTop is already in actualReg"
+ 	^ actualReg!
- 	popBoolean
- 		ifTrue: [(self ssTop type = SSRegister "and: [self ssTop spilled not]")
- 					ifTrue: [self assert: self ssTop spilled not.
- 							self assert: self ssTop annotateUse not.
- 							actualReg := self ssTop register]
- 					ifFalse: [self ssTop popToReg: preferredReg].
- 				self ssPop: 1]
- 		ifFalse: [self ssTop type = SSRegister
- 					ifTrue: [self assert: self ssTop annotateUse not.
- 							actualReg := self ssTop register]
- 					ifFalse: [self ssTop storeToReg: preferredReg]].
- 	^actualReg!

Item was added:
+ ----- Method: StackToRegisterMappingCogit>>ssStorePop:toReg: (in category 'simulation stack') -----
+ ssStorePop: popBoolean toReg: reg
+ 	"Store or pop the top simulated stack entry to a register.
+ 	N.B.: popToReg: and storeToReg: does not generate anything if 
+ 	it moves a register to the same register."	
+ 	popBoolean
+ 		ifTrue: [self ssTop popToReg: reg.
+ 				self ssPop: 1]
+ 		ifFalse: [self ssTop storeToReg: reg].!



More information about the Vm-dev mailing list