[Vm-dev] VM Maker: VMMaker.oscog-cb.1763.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Tue Apr 5 19:40:55 UTC 2016


No problem, my next commit will restart from cb.1763

2016-04-05 20:52 GMT+02: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-cb.1763.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-cb.1763
> Author: cb
> Time: 5 April 2016, 11:52:00.157 am
> UUID: eae47156-f323-4975-880e-399822579ff1
> Ancestors: VMMaker.oscog-nice.1760
>
> Nicolas, I had to temporarily revert some of my changes....
>
> I took your version and reapply only this single change.
>
> Sorry about that. Can you rebase form this version ?
>
> =============== Diff against VMMaker.oscog-nice.1760 ===============
>
> Item was changed:
>   ----- Method: SistaStackToRegisterMappingCogit>>genJumpIf:to: (in
> category 'bytecode generator support') -----
>   genJumpIf: boolean to: targetBytecodePC
>         "The heart of performance counting in Sista.  Conditional branches
> are 6 times less
>          frequent than sends and can provide basic block frequencies (send
> counters can't).
>          Each conditional has a 32-bit counter split into an upper 16 bits
> counting executions
>          and a lower half counting untaken executions of the branch.
> Executing the branch
>          decrements the upper half, tripping if the count goes negative.
> Not taking the branch
>          decrements the lower half.  N.B. We *do not* eliminate dead
> branches (true ifTrue:/true ifFalse:)
>          so that scanning for send and branch data is simplified and that
> branch data is correct."
>         <inline: false>
> +       | ok counterAddress countTripped retry nextPC nextDescriptor |
> -       | ok counterAddress countTripped retry |
>         <var: #ok type: #'AbstractInstruction *'>
>         <var: #retry type: #'AbstractInstruction *'>
>         <var: #countTripped type: #'AbstractInstruction *'>
> +       <var: #nextDescriptor type: #'AbstractInstruction *'>
>
>         (coInterpreter isOptimizedMethod: methodObj) ifTrue: [ ^ super
> genJumpIf: boolean to: targetBytecodePC ].
>
>         branchReachedOnlyForCounterTrip ifTrue:
>                 [ branchReachedOnlyForCounterTrip := false.
>                 ^ self genCounterTripOnlyJumpIf: boolean to:
> targetBytecodePC ].
> +
> +       boolean ifFalse:
> +               [ "detection of and: / or:"
> +               nextPC := bytecodePC + (self generatorAt: byte0) numBytes.
> +               nextDescriptor := self generatorAt: (objectMemory
> fetchByte: nextPC ofObject: methodObj) + bytecodeSetOffset.
> +               nextDescriptor generator ==  #genPushConstantTrueBytecode
> ifTrue: [ ^ super genJumpIf: boolean to: targetBytecodePC ].
> +               nextDescriptor := self generatorAt: (objectMemory
> fetchByte: targetBytecodePC ofObject: methodObj) + bytecodeSetOffset.
> +               nextDescriptor generator ==  #genPushConstantFalseBytecode
> ifTrue: [ ^ super genJumpIf: boolean to: targetBytecodePC ].  ].
>
> +
>         self ssFlushTo: simStackPtr - 1.
>         self ssTop popToReg: TempReg.
>         self ssPop: 1.
>
>         "We need SendNumArgsReg because of the mustBeBooleanTrampoline"
>         self ssAllocateRequiredReg: SendNumArgsReg.
>
>         retry := self Label.
>         self
>                 genExecutionCountLogicInto: [ :cAddress :countTripBranch |
>                         counterAddress := cAddress.
>                         countTripped := countTripBranch ]
>                 counterReg: SendNumArgsReg.
>         counterIndex := counterIndex + 1.
>
>         "Cunning trick by LPD.  If true and false are contiguous subtract
> the smaller.
>          Correct result is either 0 or the distance between them.  If
> result is not 0 or
>          their distance send mustBeBoolean."
>         self assert: (objectMemory objectAfter: objectMemory falseObject)
> = objectMemory trueObject.
>         self annotate: (self SubCw: boolean R: TempReg) objRef: boolean.
>         self JumpZero: (self ensureFixupAt: targetBytecodePC - initialPC).
>
>         self genFallsThroughCountLogicCounterReg: SendNumArgsReg
> counterAddress: counterAddress.
>
>         self CmpCq: (boolean == objectMemory falseObject
>                                         ifTrue: [objectMemory trueObject -
> objectMemory falseObject]
>                                         ifFalse: [objectMemory falseObject
> - objectMemory trueObject])
>                 R: TempReg.
>         ok := self JumpZero: 0.
>         self MoveCq: 0 R: SendNumArgsReg. "if counterReg is 0 this is a
> mustBeBoolean, not a counter trip."
>
>         countTripped jmpTarget:
>                 (self CallRT: (boolean == objectMemory falseObject
>                                                 ifTrue:
> [ceSendMustBeBooleanAddFalseTrampoline]
>                                                 ifFalse:
> [ceSendMustBeBooleanAddTrueTrampoline])).
>
>         "If we're in an image which hasn't got the Sista code loaded then
> the ceCounterTripped:
>          trampoline will return directly to machine code, returning the
> boolean.  So the code should
>          jump back to the retry point. The trampoline makes sure that
> TempReg has been reloaded."
>         self annotateBytecode: self Label.
>
>         self Jump: retry.
>
>         ok jmpTarget: self Label.
>         ^0!
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160405/7d3e3df2/attachment-0001.htm


More information about the Vm-dev mailing list