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!