[Vm-dev] VM Maker: VMMaker.oscog-nice.2216.mcz

commits at source.squeak.org commits at source.squeak.org
Fri May 19 12:45:12 UTC 2017


Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2216.mcz

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

Name: VMMaker.oscog-nice.2216
Author: nice
Time: 19 May 2017, 2:42:50.200889 pm
UUID: e7100d55-b865-d843-8232-f14273653125
Ancestors: VMMaker.oscog-eem.2215

The code for restoring saved registers after a CallRT: did a benign iteration in excess.

The register save part does store the highBit of the mask in reg.
For example, for callerSavedRegsToBeSaved mask = 2r100,
we will have reg = 3 after the save loop.

The restore did start by inspecting bit 1<<reg, that is 2r1000, and that's one bit to far.
This is benign as long as no overflow occurs, but let's be safer.

=============== Diff against VMMaker.oscog-eem.2215 ===============

Item was changed:
  ----- Method: Cogit>>CallFullRT:registersToBeSavedMask: (in category 'compile abstract instructions') -----
  CallFullRT: callTarget registersToBeSavedMask: registersToBeSaved
  	<returnTypeC: #'AbstractInstruction *'>
  	| callerSavedRegsToBeSaved lastInst reg registersToBePushed |
  	<var: 'lastInst' type: #'AbstractInstruction *'>
  	callerSavedRegsToBeSaved := CallerSavedRegisterMask bitAnd: registersToBeSaved.
  
  	backEnd canPushPopMultipleRegisters
  		ifTrue: [backEnd genPushRegisterMask: callerSavedRegsToBeSaved]
  		ifFalse:
  			[registersToBePushed := callerSavedRegsToBeSaved.
  			 reg := 0.
  			 [registersToBePushed ~= 0] whileTrue:
  				[(registersToBePushed anyMask: 1) ifTrue:
  					[self PushR: reg].
  				 reg := reg + 1.
  				 registersToBePushed := registersToBePushed >>> 1]].
  
  	lastInst := self CallFullRT: callTarget.
  
  	backEnd canPushPopMultipleRegisters
  		ifTrue: [^backEnd genPopRegisterMask: callerSavedRegsToBeSaved]
  		ifFalse:
+ 			[[reg > 0] whileTrue:
+ 				[reg := reg - 1.
+ 				(callerSavedRegsToBeSaved anyMask: 1 << reg) ifTrue:
+ 					[lastInst := self PopR: reg]].
- 			[[reg >= 0] whileTrue:
- 				[(callerSavedRegsToBeSaved anyMask: 1 << reg) ifTrue:
- 					[lastInst := self PopR: reg].
- 				 reg := reg - 1].
  
  			 ^lastInst]!

Item was changed:
  ----- Method: Cogit>>CallRT:registersToBeSavedMask: (in category 'compile abstract instructions') -----
  CallRT: callTarget registersToBeSavedMask: registersToBeSaved
  	<returnTypeC: #'AbstractInstruction *'>
  	| callerSavedRegsToBeSaved lastInst reg registersToBePushed |
  	<var: 'lastInst' type: #'AbstractInstruction *'>
  	callerSavedRegsToBeSaved := CallerSavedRegisterMask bitAnd: registersToBeSaved.
  
  	backEnd canPushPopMultipleRegisters
  		ifTrue: [backEnd genPushRegisterMask: callerSavedRegsToBeSaved]
  		ifFalse:
  			[registersToBePushed := callerSavedRegsToBeSaved.
  			 reg := 0.
  			 [registersToBePushed ~= 0] whileTrue:
  				[(registersToBePushed anyMask: 1) ifTrue:
  					[self PushR: reg].
  				 reg := reg + 1.
  				 registersToBePushed := registersToBePushed >>> 1]].
  
  	lastInst := self CallRT: callTarget.
  
  	backEnd canPushPopMultipleRegisters
  		ifTrue: [^backEnd genPopRegisterMask: callerSavedRegsToBeSaved]
  		ifFalse:
+ 			[[reg > 0] whileTrue:
+ 				[reg := reg - 1.
+ 				(callerSavedRegsToBeSaved anyMask: 1 << reg) ifTrue:
+ 					[lastInst := self PopR: reg]].
- 			[[reg >= 0] whileTrue:
- 				[(callerSavedRegsToBeSaved anyMask: 1 << reg) ifTrue:
- 					[lastInst := self PopR: reg].
- 				 reg := reg - 1].
  
  			 ^lastInst]!



More information about the Vm-dev mailing list