VM Maker: VMMaker.oscog-eem.2014.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.2014.mcz

commits-2
 
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!