[Vm-dev] VM Maker: VMMaker.oscog-eem.1196.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Apr 14 23:18:54 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1196.mcz

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

Name: VMMaker.oscog-eem.1196
Author: eem
Time: 14 April 2015, 4:16:37.464 pm
UUID: c4a2dfab-74cd-4fea-a202-fb28c5accc00
Ancestors: VMMaker.oscog-eem.1195

Fix bug in computing offsets for arg access in
frameless methods when args are on stack and
there is a link register.  In this case there is no
return pc to skip over.

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

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>initSimStackForFramelessBlock: (in category 'simulation stack') -----
  initSimStackForFramelessBlock: startpc
  	"The register receiver (the closure itself) and args are pushed by the closure value primitive(s)
  	 and hence a frameless block has all arguments and copied values pushed to the stack.  However,
  	 the method receiver (self) is put in the ReceiverResultRegister by the block entry."
  	| desc |
  	<var: #desc type: #'CogSimStackEntry *'>
  	simSelf
  		type: SSRegister;
  		spilled: false;
  		annotateUse: false;
  		register: ReceiverResultReg.
  	optStatus
  		isReceiverResultRegLive: true;
  		ssEntry: (self addressOf: simSelf).
  	self assert: methodOrBlockNumTemps >= methodOrBlockNumArgs.
  	0 to: methodOrBlockNumTemps - 1 do:
  		[:i|
  		desc := self simStackAt: i.
  		desc
  			type: SSBaseOffset;
  			spilled: true;
  			annotateUse: false;
  			register: SPReg;
+ 			offset: ((backEnd hasLinkRegister
+ 						ifTrue: [methodOrBlockNumArgs - 1- i]
+ 						ifFalse: [methodOrBlockNumArgs - i]) * objectMemory wordSize);
- 			offset: ((methodOrBlockNumTemps - i) * objectMemory wordSize);
  			bcptr: startpc].
  	simSpillBase := simStackPtr := methodOrBlockNumTemps - 1!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>initSimStackForFramelessMethod: (in category 'simulation stack') -----
  initSimStackForFramelessMethod: startpc
  	| desc |
  	<var: #desc type: #'CogSimStackEntry *'>
  	simSelf
  		type: SSRegister;
  		spilled: false;
  		annotateUse: false;
  		register: ReceiverResultReg.
  	optStatus
  		isReceiverResultRegLive: true;
  		ssEntry: (self addressOf: simSelf).
  	self assert: methodOrBlockNumTemps >= methodOrBlockNumArgs.
  	self assert: self numRegArgs <= 2.
  	(methodOrBlockNumArgs between: 1 and: self numRegArgs)
  		ifTrue:
  			[desc := self simStackAt: 0.
  			 desc
  				type: SSRegister;
  				spilled: false;
  				annotateUse: false;
  				register: Arg0Reg;
  				bcptr: startpc.
  			 methodOrBlockNumArgs > 1 ifTrue:
  				[desc := self simStackAt: 1.
  				 desc
  					type: SSRegister;
  					spilled: false;
  					annotateUse: false;
  					register: Arg1Reg;
  					bcptr: startpc]]
  		ifFalse:
  			[0 to: methodOrBlockNumArgs - 1 do:
  				[:i|
  				desc := self simStackAt: i.
  				desc
  					type: SSBaseOffset;
  					register: SPReg;
  					spilled: true;
  					annotateUse: false;
+ 					offset: ((backEnd hasLinkRegister
+ 								ifTrue: [methodOrBlockNumArgs - 1- i]
+ 								ifFalse: [methodOrBlockNumArgs - i]) * objectMemory wordSize);
- 					offset: ((methodOrBlockNumArgs - i) * objectMemory wordSize);
  					bcptr: startpc]].
  	simSpillBase := simStackPtr := methodOrBlockNumArgs - 1!



More information about the Vm-dev mailing list