[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