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

stephane ducasse stephane.ducasse at gmail.com
Sat Jan 12 08:35:08 UTC 2013


Hi eliot

I'm curious: what is a absent receiver dynamic super send?

Stef
On Jan 10, 2013, at 11:27 PM, commits at source.squeak.org wrote:

> 
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.253.mcz
> 
> ==================== Summary ====================
> 
> Name: VMMaker.oscog-eem.253
> Author: eem
> Time: 10 January 2013, 3:26:03.577 pm
> UUID: 4a3ac3fb-d367-478b-ad95-ad3bb8b6216f
> Ancestors: VMMaker.oscog-eem.252
> 
> Implement absent receiver dynamic super send bytecode in the JIT.
> This was an oversight from implementing absent receiver send.
> Refactor the dynamic super send code to accomodate the new send.
> 
> =============== Diff against VMMaker.oscog-eem.252 ===============
> 
> Item was changed:
>  ----- Method: SimpleStackBasedCogit>>genDynamicSuperSendBytecode (in category 'bytecode generators') -----
>  genDynamicSuperSendBytecode
> + 	^self genSendDynamicSuper: (coInterpreter literal: byte2 ofMethod: methodObj) numArgs: byte1!
> - 	| numArgs selector |
> - 	numArgs := byte1.
> - 	selector := coInterpreter literal: byte2 ofMethod: methodObj.
> - 	(objectMemory isYoung: selector) ifTrue:
> - 		[hasYoungReferent := true].
> - 	self assert: needsFrame.
> - 	self MoveMw: numArgs * BytesPerWord r: SPReg R: ReceiverResultReg.
> - 	numArgs > 2 ifTrue:
> - 		[self MoveCq: numArgs R: SendNumArgsReg].
> - 	self MoveCw: selector R: ClassReg.
> - 	self CallNewspeakSend: (dynamicSuperSendTrampolines at: (numArgs min: NumSendTrampolines - 1)).
> - 	self flag: 'currently caller pushes result'.
> - 	self PushR: ReceiverResultReg.
> - 	^0!
> 
> Item was changed:
>  ----- Method: SimpleStackBasedCogit>>genExtSendAbsentDynamicSuperBytecode (in category 'bytecode generators') -----
>  genExtSendAbsentDynamicSuperBytecode
>  	"241		11110001	i i i i i j j j	Send To Absent Dynamic Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments"
> + 	| litIndex nArgs |
> + 	litIndex := (byte1 >> 3) + (extA << 5).
> + 	extA := 0.
> + 	nArgs := (byte1 bitAnd: 7) + (extB << 3).
> + 	extB := 0.
> + 	^self genSendAbsentDynamicSuper: (coInterpreter literal: litIndex ofMethod: methodObj) numArgs: nArgs!
> - 	self shouldBeImplemented.
> - 	^EncounteredUnknownBytecode!
> 
> Item was added:
> + ----- Method: SimpleStackBasedCogit>>genSendAbsentDynamicSuper:numArgs: (in category 'bytecode generators') -----
> + genSendAbsentDynamicSuper: selector numArgs: numArgs
> + 	"Shuffle arguments if necessary and push receiver.
> + 	 Then send."
> + 	<inline: false>
> + 	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].
> + 			"if we copied the code in genSendDynamicSuper: we could save an instruction.
> + 			But we care not; the smarts are in StackToRegisterMappingCogit et al"
> + 			self MoveR: ReceiverResultReg Mw: numArgs * BytesPerWord r: SPReg].
> + 	^self genSendDynamicSuper: selector numArgs: numArgs!
> 
> Item was added:
> + ----- Method: SimpleStackBasedCogit>>genSendDynamicSuper:numArgs: (in category 'bytecode generators') -----
> + genSendDynamicSuper: selector numArgs: numArgs
> + 	(objectMemory isYoung: selector) ifTrue:
> + 		[hasYoungReferent := true].
> + 	self assert: needsFrame.
> + 	self MoveMw: numArgs * BytesPerWord r: SPReg R: ReceiverResultReg.
> + 	numArgs > 2 ifTrue:
> + 		[self MoveCq: numArgs R: SendNumArgsReg].
> + 	self MoveCw: selector R: ClassReg.
> + 	self CallNewspeakSend: (dynamicSuperSendTrampolines at: (numArgs min: NumSendTrampolines - 1)).
> + 	self flag: 'currently caller pushes result'.
> + 	self PushR: ReceiverResultReg.
> + 	^0!
> 
> Item was removed:
> - ----- Method: StackToRegisterMappingCogit>>genDynamicSuperSendBytecode (in category 'bytecode generators') -----
> - genDynamicSuperSendBytecode
> - 	| numArgs selector |
> - 	numArgs := byte1.
> - 	selector := coInterpreter literal: byte2 ofMethod: methodObj.
> - 	self marshallSendArguments: numArgs.
> - 	^self genMarshalledSendDynamicSuper: selector numArgs: numArgs!
> 
> Item was added:
> + ----- Method: StackToRegisterMappingCogit>>genSendAbsentDynamicSuper:numArgs: (in category 'bytecode generators') -----
> + genSendAbsentDynamicSuper: selector numArgs: numArgs
> + 	"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 marshallImplicitReceiverSendArguments: numArgs.
> + 	^self genMarshalledSendDynamicSuper: selector numArgs: numArgs!
> 
> Item was added:
> + ----- Method: StackToRegisterMappingCogit>>genSendDynamicSuper:numArgs: (in category 'bytecode generators') -----
> + genSendDynamicSuper: selector numArgs: numArgs
> + 	self marshallSendArguments: numArgs.
> + 	^self genMarshalledSendDynamicSuper: selector numArgs: numArgs!
> 



More information about the Vm-dev mailing list