[Vm-dev] VM Maker: VMMaker.oscog-rsf.2186.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Mar 26 20:25:08 UTC 2017
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!
More information about the Vm-dev
mailing list