[Vm-dev] VM Maker: VMMaker.oscog-eem.2014.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Nov 30 20:06:01 UTC 2016


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

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

Name: VMMaker.oscog-eem.2014
Author: eem
Time: 30 November 2016, 12:05:15.199066 pm
UUID: 39577b51-2ad7-4e7c-9a31-06dab999241b
Ancestors: VMMaker.oscog-eem.2013

RegisterAllocatingCogit:
Avoid ssStorePop:toPreferredReg: stomping on already-allocated registers.

=============== Diff against VMMaker.oscog-eem.2013 ===============

Item was added:
+ ----- Method: RegisterAllocatingCogit>>liveRegistersExceptingTopNItems: (in category 'simulation stack') -----
+ liveRegistersExceptingTopNItems: n
+ 	| regsSet |
+ 	regsSet := 0.
+ 	0 to: simStackPtr - n do:
+ 		[:i|
+ 		regsSet := regsSet bitOr: (self simStackAt: i) registerMask].
+ 	LowcodeVM ifTrue:
+ 		[(simNativeSpillBase max: 0) to: simNativeStackPtr - n do:
+ 			[:i|
+ 			regsSet := regsSet bitOr: (self simNativeStackAt: i) nativeRegisterMask]].
+ 	^regsSet!

Item was changed:
  ----- Method: RegisterAllocatingCogit>>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.
  	 Answer the actual register the result ends up in."
+ 	| actualReg liveRegisters |
- 	| actualReg |
  	actualReg := preferredReg.
  	self ssTop type = SSRegister ifTrue: 
  		[self assert: (self ssTop liveRegister = NoReg
  					  or: [self ssTop liveRegister = self ssTop register]).
  		self assert: self ssTop spilled not.
  		actualReg := self ssTop register].
  	self ssTop liveRegister ~= NoReg ifTrue:
  		[actualReg := self ssTop liveRegister].
+ 	liveRegisters := self liveRegistersExceptingTopNItems: 1.
+ 	(self register: actualReg isInMask: liveRegisters) ifTrue:
+ 		[actualReg := self allocateRegNotConflictingWith: (self registerMaskFor: preferredReg).
+ 		 actualReg = NoReg ifTrue:
+ 			[actualReg := preferredReg]].
+ 	self deny: (self register: actualReg isInMask: liveRegisters).
  	self ssStorePop: popBoolean toReg: actualReg. "generates nothing if ssTop is already in actualReg"
  	^actualReg!



More information about the Vm-dev mailing list