[Vm-dev] VM Maker: VMMaker.oscog-rmacnak.1162.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Apr 5 01:49:18 UTC 2015


Ryan Macnak uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rmacnak.1162.mcz

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

Name: VMMaker.oscog-rmacnak.1162
Author: rmacnak
Time: 4 April 2015, 6:47:29.348 pm
UUID: eedc3f6a-c3f6-4e97-90da-e51cbe7ad6ec
Ancestors: VMMaker.oscog-eem.1161

Move responsibility for ensuring ReceiverResultReg has the receiver to marshallAbsentReceiverSendArguments: and fix as-yet-encountered bug where absent self and super assumed it was already there.

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

Item was changed:
+ ----- Method: SimpleStackBasedCogit>>genSendAbsentDynamicSuper:numArgs: (in category 'bytecode generators') -----
- ----- Method: SimpleStackBasedCogit>>genSendAbsentDynamicSuper:numArgs: (in category 'bytecode generator support') -----
  genSendAbsentDynamicSuper: selector numArgs: numArgs
- 	"Shuffle arguments if necessary and push receiver.
- 	 Then send."
  	<inline: false>
  	self marshallAbsentReceiverSendArguments: numArgs.
  	^self genSend: selector numArgs: numArgs sendTable: dynamicSuperSendTrampolines!

Item was changed:
  ----- Method: SimpleStackBasedCogit>>genSendAbsentImplicitOrOuter:numArgs:depth:sendTable: (in category 'bytecode generators') -----
  genSendAbsentImplicitOrOuter: selector numArgs: numArgs depth: depth sendTable: sendTable
+ 	<var: #sendTable type: #'sqInt *'>
  	| nsSendCache |
  	(objectMemory isYoung: selector) ifTrue:
  		[hasYoungReferent := true].
  
  	nsSendCache := theIRCs + (NumOopsPerNSC * objectMemory bytesPerOop * indexOfIRC).
  	indexOfIRC := indexOfIRC + 1.
  	self assert: (objectMemory isInOldSpace: nsSendCache).
  	self initializeNSSendCache: nsSendCache selector: selector numArgs: numArgs depth: depth.
  
- 	self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.
- 
  	"This leaves the method receiver on the stack, which might not be the implicit receiver. But we care
  	 not: the callee will use ReceiverResultReg to build its frame, not the value beneath the arguments."
  	self marshallAbsentReceiverSendArguments: numArgs.
  
  	"Load the cache last so it is a fixed distance from the call."
  	self MoveCw: nsSendCache R: SendNumArgsReg.
  	self CallNewspeakSend: (sendTable at: (numArgs min: NumSendTrampolines - 1)).
  
  	self PushR: ReceiverResultReg.
  	^0!

Item was changed:
+ ----- Method: SimpleStackBasedCogit>>genSendAbsentSelf:numArgs: (in category 'bytecode generators') -----
- ----- Method: SimpleStackBasedCogit>>genSendAbsentSelf:numArgs: (in category 'bytecode generator support') -----
  genSendAbsentSelf: selector numArgs: numArgs
- 	"Shuffle arguments if necessary and push receiver.
- 	 Then send."
  	<inline: false>
  	self marshallAbsentReceiverSendArguments: numArgs.
  	^self genSend: selector numArgs: numArgs sendTable: selfSendTrampolines!

Item was changed:
+ ----- Method: SimpleStackBasedCogit>>marshallAbsentReceiverSendArguments: (in category 'bytecode generators') -----
- ----- Method: SimpleStackBasedCogit>>marshallAbsentReceiverSendArguments: (in category 'bytecode generator support') -----
  marshallAbsentReceiverSendArguments: numArgs
+ 	self assert: needsFrame.
+ 	self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.
+ 
  	"Shuffle arguments if necessary and push receiver."
  	numArgs = 0
  		ifTrue:
  			[self PushR: ReceiverResultReg]
  		ifFalse:
  			[self MoveMw: 0 r: SPReg R: TempReg.
  			self PushR: TempReg.
  			2 to: numArgs do:
  				[:index|
  				self MoveMw: index * BytesPerWord r: SPReg R: TempReg.
  				self MoveR: TempReg Mw: index - 1 * BytesPerWord r: SPReg].
  			self MoveR: ReceiverResultReg Mw: numArgs * BytesPerWord r: SPReg].!

Item was changed:
+ ----- Method: StackToRegisterMappingCogit>>genSendAbsentDynamicSuper:numArgs: (in category 'bytecode generators') -----
- ----- Method: StackToRegisterMappingCogit>>genSendAbsentDynamicSuper:numArgs: (in category 'bytecode generator support') -----
  genSendAbsentDynamicSuper: selector numArgs: numArgs
+ 	<inline: false>
- 	"OK, we could do better and avoid spilling ReceiverResultReg if we refactored
- 	 marshallImplicitReceiverSendArguments: to take a flag saying whether the
- 	 receiver was in ReceiverResultReg (absent receiver send) or on the stack
- 	 (absent dynamic super send) and in the latter case loading ReceiverResultReg
- 	 from the stack after marshalling.  But this is a rare bytecode so for the moment
- 	 don't bother."
- 	self ssAllocateCallReg: ReceiverResultReg.
- 	self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.
  	self marshallAbsentReceiverSendArguments: numArgs.
  	^self genMarshalledSend: selector numArgs: numArgs sendTable: dynamicSuperSendTrampolines!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genSendAbsentImplicitOrOuter:numArgs:depth:sendTable: (in category 'bytecode generators') -----
  genSendAbsentImplicitOrOuter: selector numArgs: numArgs depth: depth sendTable: sendTable
  	<var: #sendTable type: #'sqInt *'>
  	| nsSendCache |
  	(objectMemory isYoung: selector) ifTrue:
  		[hasYoungReferent := true].
  
  	nsSendCache := theIRCs + (NumOopsPerNSC * objectMemory bytesPerOop * indexOfIRC).
  	indexOfIRC := indexOfIRC + 1.
  	self assert: (objectMemory isInOldSpace: nsSendCache).
  	self initializeNSSendCache: nsSendCache selector: selector numArgs: numArgs depth: depth.
  
+ 	self ssAllocateCallReg: SendNumArgsReg.
- 	self ssAllocateCallReg: ReceiverResultReg and: SendNumArgsReg.
- 	self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.
  
  	"This leaves the method receiver on the stack, which might not be the implicit receiver. But we care
  	 not: the callee will use ReceiverResultReg to build its frame, not the value beneath the arguments."
  	self marshallAbsentReceiverSendArguments: numArgs.
  
  	"Load the cache last so it is a fixed distance from the call."
  	self MoveCw: nsSendCache R: SendNumArgsReg.
  	self CallNewspeakSend: (sendTable at: (numArgs min: NumSendTrampolines - 1)).
  
  	optStatus isReceiverResultRegLive: false.
+ 	self ssPushRegister: ReceiverResultReg.
+ 	^0!
- 	^self ssPushRegister: ReceiverResultReg!

Item was changed:
+ ----- Method: StackToRegisterMappingCogit>>genSendAbsentSelf:numArgs: (in category 'bytecode generators') -----
- ----- Method: StackToRegisterMappingCogit>>genSendAbsentSelf:numArgs: (in category 'bytecode generator support') -----
  genSendAbsentSelf: selector numArgs: numArgs
+ 	<inline: false>
- 	"OK, we could do better and avoid spilling ReceiverResultReg if we refactored
- 	 marshallAbsentReceiverSendArguments: to take a flag saying whether the
- 	 receiver was in ReceiverResultReg (absent receiver send) or on the stack
- 	 (absent dynamic super send) and in the latter case loading ReceiverResultReg
- 	 from the stack after marshalling.  But this is a rare bytecode so for the moment
- 	 don't bother."
- 	self ssAllocateCallReg: ReceiverResultReg.
- 	self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.
  	self marshallAbsentReceiverSendArguments: numArgs.
  	^self genMarshalledSend: selector numArgs: numArgs sendTable: selfSendTrampolines!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>marshallAbsentReceiverSendArguments: (in category 'simulation stack') -----
  marshallAbsentReceiverSendArguments: numArgs
+ 	self assert: needsFrame.
+ 	self ssAllocateCallReg: ReceiverResultReg.
+ 	self MoveMw: FoxMFReceiver r: FPReg R: ReceiverResultReg.
+ 
  	"Spill everything on the simulated stack that needs spilling (that below arguments).
  	 Marshall arguments to stack and/or registers depending on arg count.
  	 If the args don't fit in registers push receiver and args (spill everything).  Assume
  	 receiver already in ResultReceiverReg so shuffle args and push it if necessary."
  	self ssFlushTo: simStackPtr - numArgs.
  	numArgs > self numRegArgs
  		ifTrue:
  			["The arguments must be pushed to the stack, and hence the receiver
  			   must be inserted beneath the args.  Reduce or eliminate the argument
  			   shuffle by only moving already spilled items."
  			| numSpilled |
  			numSpilled := self numberOfSpillsInTopNItems: numArgs.
  			numSpilled > 0
  				ifTrue:
  					[self MoveMw: 0 r: SPReg R: TempReg.
  					 self PushR: TempReg.
  					 2 to: numSpilled do:
  						[:index|
  						self MoveMw: index * objectMemory wordSize r: SPReg R: TempReg.
  						self MoveR: TempReg Mw: index - 1 * objectMemory wordSize r: SPReg].
  					 self MoveR: ReceiverResultReg Mw: numSpilled * objectMemory wordSize r: SPReg]
  				ifFalse:
  					[self PushR: ReceiverResultReg].
  			self ssFlushTo: simStackPtr]
  		"Move the args to the register arguments, being careful to do
  		 so last to first so e.g. previous contents don't get overwritten.
  		 Also check for any arg registers in use by other args."
  		ifFalse:
  			[numArgs > 0 ifTrue:
  				[(self numRegArgs > 1 and: [numArgs > 1])
  					ifTrue:
  						[self ssAllocateRequiredReg: Arg0Reg upThrough: simStackPtr - 2.
  						 self ssAllocateRequiredReg: Arg1Reg upThrough: simStackPtr - 1]
  					ifFalse:
  						[self ssAllocateRequiredReg: Arg0Reg upThrough: simStackPtr - 1]].
  			 (self numRegArgs > 1 and: [numArgs > 1]) ifTrue:
  				[(self simStackAt: simStackPtr) popToReg: Arg1Reg].
  			 numArgs > 0 ifTrue:
  				[(self simStackAt: simStackPtr - numArgs + 1)
  					popToReg: Arg0Reg]].
  	self ssPop: numArgs!



More information about the Vm-dev mailing list