<div dir="ltr"><div>... at <a href="http://www.mirandabanda.org/files/Cog/VM/VM.r3370">http://www.mirandabanda.org/files/Cog/VM/VM.r3370</a></div><div><br></div><div>CogVM source as per VMMaker.oscog-eem.1339/r3370</div><div><br></div><div>Spur Cogit:</div><div>Since the invariant is that the receiver is never forwarded, Spur must check for</div><div>forwarding on block activation.  A become between closure creation and closure</div><div>evaluation can forward the receiver, and it must be unforwarded.  Here we do so</div><div>by checking for a forwarded receiver in the value[:] primitives. This is a</div><div>major blow to block performance; e.g. the nfib block</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>b := [:n| n &lt;= 1</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>ifTrue: [1]</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>ifFalse: [1 + (b value: n - 1) + (b value: n - 2)]].</div><div>slows down by 11%.  So we can and will do better.  We should scan for receiver</div><div>usage in the JIT and optionally compile unforwarding code in the prolog</div><div>depending on whether self is used or not.</div><div><br></div><div>Fix Spur block performance now that we follow forwarded receivers in blocks; see</div><div>VMMaker.oscog-eem.1334.  Scan blocks for inst var usage, only unforwarding in</div><div>the prologue of blocks that actually refer to inst vars.  In a test Spur Squeak</div><div>image only 12.5% of blocks do refer to inst vars.  So this is definitely a win.</div><div><br></div><div>Add a special purpose store check trampoline to store check the updated</div><div>receiver.  Make sure it&#39;s only called if the eceiuver is updated.</div><div><br></div><div>Add state to CogBytecodeDescriptor, CogBlockStart</div><div>and CogBlockMethod to track block inst var usage.</div><div><br></div><div>Sista:</div><div>Fix the bug where rcvrReg was nil in genEqualsEqualsnoBranch.</div><div><br></div><div>Generic Cogit:</div><div>Use the Tst-based generators for immediate and SmallInteger tests more widely</div><div>to save a few more instructions.</div><div><br></div><div>Fix the hack introduced in VMMaker.oscog-eem.1199 for Sista which merely stopped</div><div>reclaiming closed PICs.  In non-Sista VMs do the usual thing of decaying usage</div><div>counts on PICs, as with methods, and reclaiming those least used.  In Sista,</div><div>retain PICs until the next cycle, identifying unused PICs as part of the</div><div>compaction scan, reminiscent of tri-colour incremental GC.</div><div><br></div><div>Move defaultCogCodeSize into the CogAbstractInstruction hierarchy so that</div><div>e.g.  CogARMCompiler can specify a larger default code zone.</div><div><br></div><div>Newspeak Cogit:</div><div>Fix assert-fails with absent receiver sends in Newspeak.  Have the implicit</div><div>and outer send lookup trampolines set the stacked receiver (when there is one)</div><div>when setting the implciit receiver.</div><div><br></div><div>Streamline send trampoline creation by refactoring trampoline name generation</div><div>so that the two limits, NumSendTrampolines - 2 and numRegArgs are treated</div><div>separately, and numArgsOrSendNumArgsReg: answers the relevant numArgs argument.</div><div>This should clear up confusion between numRegArgs (which can be 0, 1 &amp; 2) and</div><div>NumSendTrampolines - 2, which is always 2.</div><div><br></div><div>linux builds:</div><div>Fix VERSION_TAG format to agree with existing convention.</div>-- <br><div class="gmail_signature">best,<div>Eliot</div></div>
</div>