[Vm-dev] VM Maker: VMMaker.oscog-eem.1696.mcz
Eliot Miranda
eliot.miranda at gmail.com
Wed Feb 24 04:36:41 UTC 2016
_,,,^..^,,,_ (phone)
> On Feb 23, 2016, at 6:48 PM, Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com> wrote:
>
>
>
> 2016-02-24 1:35 GMT+01:00 <commits at source.squeak.org>:
>>
>> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
>> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1696.mcz
>>
>> ==================== Summary ====================
>>
>> Name: VMMaker.oscog-eem.1696
>> Author: eem
>> Time: 23 February 2016, 4:35:02.71435 pm
>> UUID: 4db47df6-c329-44ca-a255-7483a9cac28f
>> Ancestors: VMMaker.oscog-tfel.1695
>>
>> Fix serious bug in jitted perform: primitive. Thanks to Stéphane Ducasse for finding and to Levente Uzoni for diagnosing
>
> Rendons à Stéphane Rollandin ce qui n'est pas à César...
Pardonnez moi! Je suis desole!
>> the bug. If the argument count is one greater than the max number of register aerguments (2 in Spur, hence perform:with:with:) then the code to remove the receiver and arguments from the stack forgot to remove the receiver and selector.
>>
>> =============== Diff against VMMaker.oscog-tfel.1695 ===============
>>
>> Item was changed:
>> ----- Method: StackToRegisterMappingCogit>>adjustArgumentsForPerform: (in category 'primitive generators') -----
>> adjustArgumentsForPerform: numArgs
>> "Generate code to adjust the possibly stacked arguments immediately
>> before jumping to a method looked up by a perform primitive."
>> self assert: self numRegArgs <= 2.
>> self assert: numArgs >= 1.
>> numArgs <= self numRegArgs ifTrue:
>> [numArgs = 2 ifTrue:
>> [self MoveR: Arg1Reg R: Arg0Reg].
>> ^self].
>>
>> + "If the arity is one more than the max numRegArgs, the receiver and all arguments have to be removed from the stack."
>> self numRegArgs + 1 = numArgs ifTrue:
>> [backEnd hasLinkRegister
>> ifTrue:
>> + [self numRegArgs = 2
>> + ifTrue:
>> + [self MoveMw: 0 r: SPReg R: Arg1Reg.
>> + self MoveMw: objectMemory wordSize r: SPReg R: Arg0Reg]
>> + ifFalse:
>> + [self MoveMw: 0 r: SPReg R: Arg0Reg].
>> + self AddCq: numArgs + 1 * objectMemory wordSize R: SPReg]
>> - [self numRegArgs = 2 ifTrue:
>> - [self PopR: Arg1Reg].
>> - self PopR: Arg0Reg]
>> ifFalse:
>> + [self MoveMw: 0 r: SPReg R: TempReg. "save retpc"
>> + self numRegArgs = 2
>> + ifTrue:
>> + [self MoveMw: objectMemory wordSize r: SPReg R: Arg1Reg.
>> + self MoveMw: objectMemory wordSize * 2 r: SPReg R: Arg0Reg]
>> + ifFalse:
>> + [self MoveMw: objectMemory wordSize r: SPReg R: Arg0Reg].
>> + self AddCq: numArgs + 1 * objectMemory wordSize R: SPReg.
>> + self MoveR: TempReg Mw: 0 r: SPReg "Overwrite pushed receiver; ReceiverResultReg already contains receiver."].
>> - [self PopR: TempReg. "save retpc"
>> - self numRegArgs = 2 ifTrue:
>> - [self PopR: Arg1Reg].
>> - self MoveMw: 0 r: SPReg R: Arg0Reg.
>> - self MoveR: TempReg Mw: 0 r: SPReg].
>> ^self].
>>
>> "e.g. Receiver Receiver
>> Selector/Arg0 => Arg1
>> Arg1 Arg2
>> Arg2 sp-> Arg3
>> sp-> Arg3"
>> super adjustArgumentsForPerform: numArgs!
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160223/02c64c31/attachment-0001.htm
More information about the Vm-dev
mailing list