VM Maker: VMMaker.oscog-rsf.2186.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-rsf.2186.mcz

commits-2
 
Ronie Salgado Faila uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rsf.2186.mcz

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

Name: VMMaker.oscog-rsf.2186
Author: rsf
Time: 26 March 2017, 5:24:45.171099 pm
UUID: 24ab1aca-5dbe-4061-9709-da0e2cbf492f
Ancestors: VMMaker.oscog-rsf.2185

Fixing the problem with the Lowcode register allocator.

=============== Diff against VMMaker.oscog-rsf.2185 ===============

Item was changed:
  ----- Method: CogObjectRepresentation>>genLcFloat32:toOop: (in category 'inline primitive support') -----
  genLcFloat32: value toOop: object
  <option: #LowcodeVM>
  cogit ConvertRs: value Rd: DPFPReg0.
  cogit CallRT: ceFloatObjectOfTrampoline.
 
+ cogit MoveR: TempReg R: object.
+ cogit ssPushRegister: object.!
- cogit MoveR: TempReg R: ReceiverResultReg.
- cogit ssPushRegister: ReceiverResultReg.!

Item was changed:
  ----- Method: CogObjectRepresentation>>genLcFloat64:toOop: (in category 'inline primitive support') -----
  genLcFloat64: value toOop: object
  <option: #LowcodeVM>
  value ~= DPFPReg0 ifTrue: [ cogit MoveRd: value Rd: DPFPReg0].
  cogit CallRT: ceFloatObjectOfTrampoline.
 
+ cogit MoveR: TempReg R: object.
+ cogit ssPushRegister: object.!
- cogit MoveR: TempReg R: ReceiverResultReg.
- cogit ssPushRegister: ReceiverResultReg.!

Item was changed:
  ----- Method: CogSimStackNativeEntry>>nativeFloatRegisterOrNone (in category 'accessing') -----
  nativeFloatRegisterOrNone
+ ^ (type = SSRegisterSingleFloat or: [type = SSRegisterDoubleFloat])
- ^ ([type = SSRegisterSingleFloat] or: [type = SSRegisterDoubleFloat])
  ifTrue: [register]
  ifFalse: [NoReg]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOop2: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOop2: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop rOopNext oopTopRegisterMask |
  rOopTop := rOopNext := NoReg.
  oopTopRegisterMask := 0.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  (self ssValue: 1) registerOrNone ~= NoReg ifTrue: [
  rOopNext := (self ssValue: 1) registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopNext usedBefore: 1) ifTrue: [
+ rOopNext := NoReg
+ ].
+ rOopNext ~= NoReg ifTrue: [
+ oopTopRegisterMask := self registerMaskFor: rOopNext.
+ ].
- oopTopRegisterMask := self registerMaskFor: rOopNext.
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: oopTopRegisterMask
  ].
 
  rOopNext = NoReg ifTrue: [
  rOopNext := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop)
  ].
 
  self deny: (rOopTop = NoReg or: [rOopNext = NoReg ]).
  ^ aBlock value: rOopTop value: rOopNext
  !

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOop2ResultInteger: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOop2ResultInteger: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop rOopNext rResult oopTopRegisterMask |
  rOopTop := rOopNext := NoReg.
  rResult := NoReg.
  oopTopRegisterMask := 0.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  (self ssValue: 1) registerOrNone ~= NoReg ifTrue: [
  rOopNext := (self ssValue: 1) registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopNext usedBefore: 1) ifTrue: [
+ rOopNext := NoReg
+ ].
+ rOopNext ~= NoReg ifTrue: [
+ oopTopRegisterMask := self registerMaskFor: rOopNext.
+ ].
- oopTopRegisterMask := self registerMaskFor: rOopNext.
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: oopTopRegisterMask
  ].
 
  rOopNext = NoReg ifTrue: [
+ rOopNext := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop).
- rOopNext := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop)
  ].
 
  rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop and: rOopNext).
 
  self deny: (rOopTop = NoReg or: [rOopNext = NoReg or: [rResult = NoReg]]).
  ^ aBlock value: rOopTop value: rOopNext value: rResult
  !

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOop: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOop: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop  |
  rOopTop := NoReg.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: (self emptyRegisterMask)
  ].
 
  self deny: (rOopTop = NoReg).
  ^ aBlock value: rOopTop
  !

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOopResultFloat: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOopResultFloat: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop  frResult |
  rOopTop := NoReg.
  frResult := NoReg.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: (self emptyRegisterMask)
  ].
 
  frResult := self allocateFloatRegNotConflictingWith: (self emptyRegisterMask).
 
  self deny: (rOopTop = NoReg or: [frResult = NoReg]).
  ^ aBlock value: rOopTop value: frResult
  !

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOopResultInteger2: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOopResultInteger2: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop rResult rResult2 |
  rOopTop := NoReg.
  rResult := rResult2 := NoReg.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: (self emptyRegisterMask)
  ].
 
  rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop).
  rResult2 := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop and: rResult).
 
  self deny: (rOopTop = NoReg or: [rResult = NoReg]).
  ^ aBlock value: rOopTop value: rResult value: rResult2
  !

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOopResultInteger: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOopResultInteger: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop rResult |
  rOopTop := NoReg.
  rResult := NoReg.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: (self emptyRegisterMask)
  ].
 
  rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop).
 
  self deny: (rOopTop = NoReg or: [rResult = NoReg]).
  ^ aBlock value: rOopTop value: rResult
  !

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>allocateRegistersForLowcodeOopResultOop: (in category 'inline primitive register allocation') -----
  allocateRegistersForLowcodeOopResultOop: aBlock
  <option: #LowcodeVM>
  <inline: true>
 
  | rOopTop rResult |
  rOopTop := NoReg.
  rResult := NoReg.
 
  self ssTop registerOrNone ~= NoReg ifTrue:  [
  rOopTop := self ssTop registerOrNone.
+ "Ensure we are not using a duplicated register."
+ (self isOopRegister: rOopTop usedBefore: 0) ifTrue: [
+ rOopTop := NoReg
+ ]
  ].
 
  rOopTop = NoReg ifTrue: [
  rOopTop := self allocateRegNotConflictingWith: (self emptyRegisterMask)
  ].
 
  rResult := self allocateRegNotConflictingWith: (self registerMaskFor: rOopTop).
 
  self deny: (rOopTop = NoReg or: [rResult = NoReg]).
  ^ aBlock value: rOopTop value: rResult
  !

Item was added:
+ ----- Method: StackToRegisterMappingCogit>>isOopRegister:usedBefore: (in category 'inline primitive register allocation') -----
+ isOopRegister: register usedBefore: stackIndex
+ <option: #LowcodeVM>
+ <inline: true>
+ | index |
+ index := simSpillBase max: 0.
+ index to: simStackPtr - stackIndex do: [ :i |
+ (self simStackAt: index) registerOrNone = register ifTrue: [
+ ^ true
+ ]
+ ].
+
+ ^ false!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>ssFlushAll (in category 'simulation stack') -----
  ssFlushAll
  <inline: true>
+ self ssFlushTo: simStackPtr nativeFlushTo: simNativeStackPtr.
+ self voidReceiverResultRegContainsSelf.!
- self ssFlushTo: simStackPtr nativeFlushTo: simNativeStackPtr!