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!
vm-dev@lists.squeakfoundation.org