[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