<div dir="ltr">I love that commit. I&#39;m glad you have some time to work on it :-).</div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-05-19 20:52 GMT+02:00  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</span>:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Eliot Miranda uploaded a new version of BytecodeSets to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/BytecodeSets-eem.2.mcz" target="_blank">http://source.squeak.org/VMMaker/BytecodeSets-eem.2.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: BytecodeSets-eem.2<br>
Author: eem<br>
Time: 19 May 2014, 11:52:50.933 am<br>
UUID: 913085ca-0802-4f32-8b85-61432bb1c1f5<br>
Ancestors: BytecodeSets-eem.1<br>
<br>
Provide the multiple bytecode set support for<br>
InstructionStream and CompiledMethod expected by<br>
Compiler-eem.282/Kernel-eem.852 for<br>
EncoderForNewsqueakV3<br>
EncoderForNewsqueakV4<br>
EncoderForSistaV1<br>
<br>
=============== Diff against BytecodeSets-eem.1 ===============<br>
<br>
Item was changed:<br>
  SystemOrganization addCategory: #&#39;BytecodeSets-NewsqueakV3&#39;!<br>
+ SystemOrganization addCategory: #&#39;BytecodeSets-SistaV1&#39;!<br>
  SystemOrganization addCategory: #&#39;BytecodeSets-NewsqueakV4&#39;!<br>
<br>
Item was changed:<br>
  EncoderForV3PlusClosures subclass: #EncoderForNewsqueakV3<br>
        instanceVariableNames: &#39;&#39;<br>
        classVariableNames: &#39;&#39;<br>
        poolDictionaries: &#39;&#39;<br>
        category: &#39;BytecodeSets-NewsqueakV3&#39;!<br>
+<br>
+ !EncoderForNewsqueakV3 commentStamp: &#39;eem 5/17/2014 16:42&#39; prior: 0!<br>
+ An encoder for the Newsqueak V3 bytecode set.  It adds the following bytecodes that are part of the first Newspeak bytecode set.<br>
+<br>
+       127     01111111 kkkkkkkk               Push Implicit Receiver For Selector (self literalAt: kkkkkkkk)<br>
+       126     01111110 jjjjjjjj kkkkkkkk      Send Selector (self literalAt: kkkkkkkk) To Dynamic Superclass With NumArgs jjjjjjjj<br>
+       139     01000101 kkkkkkkk               Push Explicit Outer Receiver For Level (self literalAt: kkkkkkkk)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV3 class&gt;&gt;bytecodeSize: (in category &#39;instruction stream support&#39;) -----<br>
+ bytecodeSize: bytecode<br>
+       &quot;Answer the number of bytes in the bytecode.&quot;<br>
+       bytecode &lt;= 125 ifTrue:<br>
+               [^1].<br>
+       bytecode &gt;= 176 ifTrue:<br>
+               [^1].<br>
+       bytecode &gt;= 160 ifTrue: &quot;long jumps&quot;<br>
+               [^2].<br>
+       bytecode &gt;= 144 ifTrue: &quot;short jumps&quot;<br>
+               [^1].<br>
+       &quot;126, 127 &amp; extensions&quot;<br>
+       ^#(3 2 2 2 2 2 3 2 2 1 1 1 2 2 3 3 3 4) at: bytecode - 125!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;bindingReadScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ bindingReadScanBlockFor: litVarIndex using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for reads of the value of the binding with zero-relative index litVarIndex.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;       16-31           0001 i i i i                            Push Literal Variable #iiii<br>
+        *      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      227             11100011        i i i i i i i i Push Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b &lt; 32 and: [b &gt;= 16 and: [b - 16 = litVarIndex]])<br>
+           or: [b = 227<br>
+                       and: [scanner followingByte + prevext = litVarIndex]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;bindingWriteScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ bindingWriteScanBlockFor: litVarIndex using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for writes of the value of the binding with zero-relative index litVarIndex.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;*      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      233             11101001        i i i i i i i i Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+        *      236             11101100        i i i i i i i i Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b = 233 or: [b = 236])<br>
+          and: [scanner followingByte + prevext = litVarIndex]]!<br>
<br>
Item was removed:<br>
- ----- Method: EncoderForNewsqueakV4 class&gt;&gt;blockReturnCode (in category &#39;bytecode decoding&#39;) -----<br>
- blockReturnCode<br>
-       &quot;218            11011010                Return Stack Top From Block [* return from enclosing block N, N = Extend A]&quot;<br>
-       ^218!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;bytecodeSize: (in category &#39;instruction stream support&#39;) -----<br>
+ bytecodeSize: bytecode<br>
+       &quot;Answer the number of bytes in the bytecode.&quot;<br>
+       bytecode &lt; 224 ifTrue: [^1].<br>
+       bytecode &lt; 249 ifTrue: [^2].<br>
+       ^3!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;createClosureScanBlock (in category &#39;compiled method support&#39;) -----<br>
+ createClosureScanBlock<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for block closure creation bytecodes.  ote that with this interface we can&#39;t answer<br>
+        true for the extension in front of a push closure bytecode and so the interface may<br>
+        have to change at some point.&quot;<br>
+<br>
+       &quot;*      224     11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      225     11100001        sbbbbbbb                        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        **     253     11111101 eei i i kkk    jjjjjjjj        Push Closure Num Copied iii (+ Ext A // 16 * 8) Num Args kkk (+ Ext A \\ 16 * 8) BlockSize jjjjjjjj (+ Ext B * 256). ee = num extensions&quot;<br>
+       ^[:b| b = 253]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;extensionsAt:in:into: (in category &#39;compiled method support&#39;) -----<br>
+ extensionsAt: bcpc in: method into: aTrinaryBlock<br>
+       &quot;If the bytecode at pc is an extension then evaluate aBinaryBlock with the values of extA and extB and number of extension *bytes*.<br>
+        If the bytecode at pc is not extended then evaluate aBinaryBlock with 0 and 0.<br>
+       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)&quot;<br>
+<br>
+       | scanpc byte extByte extA extB |<br>
+       scanpc := bcpc.<br>
+       &quot;There may be an extension (it could be a false positive).  We must scan as fast as possible...&quot;<br>
+       extA := extB := 0.<br>
+       [byte := method at: scanpc.<br>
+        byte &gt;= 224 and: [byte &lt;= 225]] whileTrue:<br>
+               [extByte := method at: scanpc + 1.<br>
+                scanpc := scanpc + 2.<br>
+                byte = 224<br>
+                       ifTrue:<br>
+                               [extA := (extA bitShift: 8) + extByte]<br>
+                       ifFalse:<br>
+                               [extB := (extB = 0 and: [extByte &gt; 127])<br>
+                                       ifTrue: [extByte - 256]<br>
+                                       ifFalse: [(extB bitShift: 8) + extByte]]].<br>
+       ^aTrinaryBlock value: extA value: extB value: scanpc - bcpc<br>
+<br>
+<br>
+ &quot;Why use<br>
+       byte &gt;= 224 and: [byte &lt;= 225]<br>
+  and not<br>
+       (byte bitAnd: 16rFE) = 16rE0<br>
+  ?<br>
+  | n |<br>
+  n := 100000000.<br>
+  #(0 224) collect:<br>
+       [:byte|<br>
+       { Time millisecondsToRun: [1 to: n do: [:i| (byte &gt;= 224 and: [byte &lt;= 225]) ifTrue: []]].<br>
+          Time millisecondsToRun: [1 to: n do: [:i| (byte bitAnd: 16rFE) = 16rE0 ifTrue: []]] }] #(#(297 599) #(702 671))&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;instVarReadScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ instVarReadScanBlockFor: varIndexCode using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for reads of the inst var with zero-relative index varIndexCode.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;       0-15            0000 i i i i                            Push Receiver Variable #iiii<br>
+       *       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       *       226             11100010        i i i i i i i i Push Receiver Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b &lt; 16 and: [b = varIndexCode])<br>
+           or: [b = 226<br>
+                       and: [scanner followingByte + prevext = varIndexCode]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;instVarWriteScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ instVarWriteScanBlockFor: varIndexCode using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for writes of the inst var with zero-relative index varIndexCode.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;       176-183 10110 i i i                             Pop and Store Receiver Variable #iii<br>
+       *       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       *       232             11101000        i i i i i i i i Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+       *       235             11101011        i i i i i i i i Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b &gt;= 176<br>
+           and: [b &lt; 184<br>
+           and: [b - 176 = varIndexCode]])<br>
+          or: [(b = 232 or: [b = 235])<br>
+                 and: [scanner followingByte + prevext = varIndexCode]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;interpretJumpIfCondIn: (in category &#39;compiled method support&#39;) -----<br>
+ interpretJumpIfCondIn: anInstructionStream<br>
+       &quot;Double-dispatch through the encoder to select the correct conditional jump decoder for the instruction set.&quot;<br>
+       ^anInstructionStream interpretNSV4JumpIfCond!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;interpretJumpIn: (in category &#39;compiled method support&#39;) -----<br>
+ interpretJumpIn: anInstructionStream<br>
+       &quot;Double-dispatch through the encoder to select the correct unconditional jump decoder for the instruction set.&quot;<br>
+       ^anInstructionStream interpretNSV4Jump!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isBlockReturnAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isBlockReturnAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a return from block.&quot;<br>
+       &quot;218            11011010                Return Stack Top From Block [* return from enclosing block N, N = Extend A]&quot;<br>
+       ^(self nonExtensionBytecodeAt: pc in: method) = 218!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isBranchIfFalseAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isBranchIfFalseAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a conditional branch-if-false.&quot;<br>
+<br>
+       &quot;       208-215 11010 i i i                             Pop and Jump 0n False iii +1 (i.e., 1 through 8)<br>
+        *      244             11110100        i i i i i i i i Pop and Jump 0n False i i i i i i i i (+ Extend B * 256, where Extend B &gt;= 0)&quot;<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 208 and: [byte &lt;= 215 or: [byte = 244]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isBranchIfTrueAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isBranchIfTrueAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a conditional branch-if-true.&quot;<br>
+<br>
+       &quot;       200-207 11001 i i i                             Pop and Jump 0n True iii +1 (i.e., 1 through 8)<br>
+        *      243             11110011        i i i i i i i i Pop and Jump 0n True i i i i i i i i (+ Extend B * 256, where Extend B &gt;= 0)&quot;<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 200 and: [byte &lt;= 207 or: [byte = 243]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isExtension: (in category &#39;instruction stream support&#39;) -----<br>
+ isExtension: bytecode<br>
+       &quot;Answer if the bytecode is an extension bytecode, i.e. one that extends<br>
+        the range of the following bytecode.&quot;<br>
+       ^bytecode &gt;= 16rE0 and: [bytecode &lt;= 16rE1]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isJumpAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isJumpAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is an (unconditional) jump.&quot;<br>
+<br>
+       &quot;       192-199 11000 i i i                             Jump iii + 1 (i.e., 1 through 8)<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        *      242             11110010        i i i i i i i i Jump i i i i i i i i (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 192 and: [byte &lt;= 199 or: [byte = 242]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isJustPopAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isJustPopAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a pop.&quot;<br>
+<br>
+       ^(method at: pc) = 220 &quot;220             11011100                Pop Stack Top&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isRealSendAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isRealSendAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a real message-send, not blockCopy:.&quot;<br>
+<br>
+       ^self isSendAt: pc in: method!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isReturnAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isReturnAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a return from block.&quot;<br>
+       &quot;216            11011000                Return Receiver From Message<br>
+        217            11011001                Return Stack Top From Message<br>
+        218            11011010                Return Stack Top From Block [* return from enclosing block N, N = Extend A]&quot;<br>
+       ^(self nonExtensionBytecodeAt: pc in: method) between: 216 and: 218!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isSendAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isSendAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a message-send.&quot;<br>
+<br>
+       &quot;       80-95           0101 i i i i            Send Arithmetic Message #iiii<br>
+               96-111          0110 i i i i            Send Special Message #iiii<br>
+               112-127 0111 i i i i            Send Literal Selector #iiii With 0 Arguments<br>
+               128-143 1000 i i i i            Send Literal Selector #iiii With 1 Argument<br>
+               144-159 1001 i i i i            Send Literal Selector #iiii With 2 Arguments<br>
+               160-175 1010 i i i i            Send To Absent Implicit Receiver Literal Selector #iiii With 0 Arguments<br>
+        *      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        **     238             11101110        i i i i i j j j Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+        **     239             11101111        i i i i i j j j Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+        **     240             11110000        i i i i i j j j Send To Absent Implicit Receiver Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+        **     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&quot;<br>
+<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 80<br>
+         and: [byte &lt;= 175<br>
+                or: [byte &lt;= 241 and: [byte &gt;= 238]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isStoreAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isStoreAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a store or store-pop.&quot;<br>
+<br>
+       &quot;       176-183 10110 i i i                                             Pop and Store Receiver Variable #iii<br>
+               184-191 10111 i i i                                             Pop and Store Temporary Variable #iii<br>
+        *      224             11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      232             11101000        i i i i i i i i                 Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+        *      233             11101001        i i i i i i i i                 Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+               234             11101010        i i i i i i i i                 Store Temporary Variable #iiiiiiii<br>
+        *      235             11101011        i i i i i i i i                 Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+        *      236             11101100        i i i i i i i i                 Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+               237             11101101        i i i i i i i i                 Pop and Store Temporary Variable #iiiiiiii<br>
+               251             11111011 kkkkkkkk       jjjjjjjj        Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj<br>
+               252             11111100 kkkkkkkk       jjjjjjjj        Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 176<br>
+         and: [byte &lt;= 191<br>
+                or: [(byte between: 232 and: 237)<br>
+                or: [(byte between: 251 and: 252)]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;isStorePopAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isStorePopAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a store-pop.&quot;<br>
+<br>
+       &quot;       176-183 10110 i i i                                             Pop and Store Receiver Variable #iii<br>
+               184-191 10111 i i i                                             Pop and Store Temporary Variable #iii<br>
+        *      224             11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      235             11101011        i i i i i i i i                 Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+        *      236             11101100        i i i i i i i i                 Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+               237             11101101        i i i i i i i i                 Pop and Store Temporary Variable #iiiiiiii<br>
+               252             11111100 kkkkkkkk       jjjjjjjj        Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 176<br>
+         and: [byte &lt;= 191<br>
+                or: [(byte between: 235 and: 237)<br>
+                or: [byte = 252]]]!<br>
<br>
Item was removed:<br>
- ----- Method: EncoderForNewsqueakV4 class&gt;&gt;method:readsField: (in category &#39;scanning&#39;) -----<br>
- method: method readsField: varIndex<br>
-       &quot;Answer if method loads the instance variable indexed by varIndex.<br>
-        N.B. Don&#39;t assume the compiler uses the most compact encoding available.<br>
-               0-15            0000 i i i i                            Push Receiver Variable #iiii<br>
-       *       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
-       *       226             11100010        i i i i i i i i Push Receiver Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
-       | varIndexCode scanner extension |<br>
-       varIndexCode := varIndex - 1.<br>
-       method isReturnField ifTrue:<br>
-               [^method returnField = varIndexCode].<br>
-       extension := 0.<br>
-       ^(scanner := InstructionStream on: method) scanFor:<br>
-               [:b| | prevext |<br>
-               prevext := extension.<br>
-               extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
-               (b &lt; 16 and: [b = varIndexCode])<br>
-               or: [b = 226<br>
-                       and: [scanner followingByte + prevext = varIndexCode]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;method:refersInBytecodeToLiteral:specialSelectorIndex: (in category &#39;scanning&#39;) -----<br>
+ method: method refersInBytecodeToLiteral: aLiteral specialSelectorIndex: specialOrNil<br>
+       &quot;Answer if method refers to the literal aLiteral in the bytecode, as opposed to in its literal frame.&quot;<br>
+<br>
+       &quot;*      77                      01001101                                Push false [* 1:true, 2:nil, 3:thisContext, ..., -N: pushExplicitOuter: N, N = Extend B]<br>
+               78                      01001110                                Push 0<br>
+               79                      01001111                                Push 1<br>
+               80-95           0101 i i i i                            Send Arithmetic Message #iiii<br>
+               96-111          0110 i i i i                            Send Special Message #iiii<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        *      229             11100101        i i i i i i i i Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       | byte extended scanner |<br>
+       specialOrNil ifNotNil:<br>
+               [byte := specialOrNil + 79.<br>
+               ^(InstructionStream on: method) scanFor: [:b| b = byte]].<br>
+       extended := false.<br>
+       aLiteral isInteger ifTrue:<br>
+               [(aLiteral &gt;= -32768 and: [aLiteral &lt;= 32767]) ifFalse: [^false].<br>
+                scanner := InstructionStream on: method.<br>
+                (aLiteral &gt;= 0 and: [aLiteral &lt;= 255]) ifTrue:<br>
+                       [aLiteral &lt;= 1 ifTrue:<br>
+                               [byte := aLiteral + 80.<br>
+                                ^scanner scanFor: [:b| b = byte]].<br>
+                        ^scanner scanFor:<br>
+                               [:b|<br>
+                               (b = 229<br>
+                                and: [extended not<br>
+                                and: [scanner followingByte = aLiteral]])<br>
+                               or: [extended := b = 225.<br>
+                                       false]]].<br>
+                byte := (aLiteral bitShift: -8) bitAnd: 255.<br>
+               ^scanner scanFor:<br>
+                       [:b|<br>
+                       (b = 229<br>
+                        and: [extended<br>
+                        and: [scanner followingByte = (aLiteral bitAnd: 255)]])<br>
+                       or: [extended := b = 225 and: [scanner followingByte = byte].<br>
+                               false]]].<br>
+       byte := #(false true nil) identityIndexOf: aLiteral ifAbsent: 0.<br>
+       byte = 0 ifTrue:<br>
+               [^false].<br>
+       scanner := InstructionStream on: method.<br>
+       byte = 1 ifTrue:<br>
+               [^scanner scanFor:<br>
+                       [:b|<br>
+                       (b = 77<br>
+                        and: [extended not])<br>
+                       or: [extended := b = 225.<br>
+                               false]]].<br>
+       byte := byte - 1.<br>
+       ^scanner scanFor:<br>
+               [:b|<br>
+               (b = 77<br>
+                and: [extended])<br>
+               or: [extended := b = 225 and: [scanner followingByte = byte].<br>
+                       false]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;nonExtensionBytecodeAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ nonExtensionBytecodeAt: pc in: method<br>
+       &quot;Answer the actual bytecode at pc in method, skipping past any preceeding extensions.&quot;<br>
+       | thePC bytecode |<br>
+       thePC := pc.<br>
+       [self isExtension: (bytecode := method at: thePC)] whileTrue:<br>
+               [thePC := thePC + (self bytecodeSize: bytecode)].<br>
+       ^bytecode!<br>
<br>
Item was removed:<br>
- ----- Method: EncoderForNewsqueakV4 class&gt;&gt;popCode (in category &#39;bytecode decoding&#39;) -----<br>
- popCode<br>
-       &quot;220            11011100                Pop Stack Top&quot;<br>
-       ^220!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;superSendScanBlockUsing: (in category &#39;instruction stream support&#39;) -----<br>
+ superSendScanBlockUsing: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor:<br>
+        that answers true for super sends.&quot;<br>
+<br>
+       &quot;*      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        **     239             11101111        i i i i i j j j Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+        **     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&quot;<br>
+<br>
+       ^[:instr | instr = 239 or: [instr = 241]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4 class&gt;&gt;supportsClosures (in category &#39;compiled method support&#39;) -----<br>
+ supportsClosures<br>
+       &quot;Answer if the instruction set supports closures (contains<br>
+        closure creation and indirect temp access bytecodes).&quot;<br>
+<br>
+       ^true!<br>
<br>
Item was changed:<br>
  ----- Method: EncoderForNewsqueakV4&gt;&gt;genBranchPopFalse: (in category &#39;bytecode generation&#39;) -----<br>
  genBranchPopFalse: distance<br>
-       | distanceMod256 |<br>
-       (distance &lt; 0 or: [distance &gt; 32767]) ifTrue:<br>
-               [^self outOfRangeError: &#39;distance&#39; index: distance range: 0 to: 32767].<br>
        (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
                [&quot;208-215       11010 i i i             Pop and Jump 0n False iii +1 (i.e., 1 through 8)&quot;<br>
                 stream nextPut: 207 + distance.<br>
                 ^self].<br>
+       ^self genBranchPopFalseLong: distance!<br>
-       &quot;244            11110100        i i i i i i i i Pop and Jump 0n False i i i i i i i i (+ Extend B * 256)&quot;<br>
-       distanceMod256 := (distance &lt; 0 or: [distance &gt; 255])<br>
-                                                               ifTrue:<br>
-                                                                       [self genUnsignedSingleExtendB: (distance bitShift: -8).<br>
-                                                                        distance bitAnd: 255]<br>
-                                                               ifFalse: [distance].<br>
-       stream<br>
-               nextPut: 244;<br>
-               nextPut: distanceMod256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4&gt;&gt;genBranchPopFalseLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genBranchPopFalseLong: distance<br>
+       &quot;244            11110100        i i i i i i i i Pop and Jump 0n False i i i i i i i i (+ Extend B * 256)&quot;<br>
+       | distanceMod256 |<br>
+       (distance &lt; 0 or: [distance &gt; 32767]) ifTrue:<br>
+               [^self outOfRangeError: &#39;distance&#39; index: distance range: 0 to: 32767].<br>
+       distanceMod256 := (distance &lt; 0 or: [distance &gt; 255])<br>
+                                                               ifTrue:<br>
+                                                                       [self genUnsignedSingleExtendB: (distance bitShift: -8).<br>
+                                                                        distance bitAnd: 255]<br>
+                                                               ifFalse: [distance].<br>
+       stream<br>
+               nextPut: 244;<br>
+               nextPut: distanceMod256!<br>
<br>
Item was changed:<br>
  ----- Method: EncoderForNewsqueakV4&gt;&gt;genBranchPopTrue: (in category &#39;bytecode generation&#39;) -----<br>
  genBranchPopTrue: distance<br>
-       | distanceMod256 |<br>
-       (distance &lt; 0 or: [distance &gt; 32767]) ifTrue:<br>
-               [^self outOfRangeError: &#39;distance&#39; index: distance range: 0 to: 32767].<br>
        (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
                [&quot;200-207       11001 i i i             Pop and Jump 0n True iii +1 (i.e., 1 through 8)&quot;<br>
                 stream nextPut: 199 + distance.<br>
                 ^self].<br>
+       ^self genBranchPopTrueLong: distance!<br>
-       &quot;243            11110011        i i i i i i i i Pop and Jump 0n True i i i i i i i i (+ Extend B * 256)&quot;<br>
-       distanceMod256 := (distance &lt; 0 or: [distance &gt; 255])<br>
-                                                               ifTrue:<br>
-                                                                       [self genUnsignedSingleExtendB: (distance bitShift: -8).<br>
-                                                                        distance bitAnd: 255]<br>
-                                                               ifFalse: [distance].<br>
-       stream<br>
-               nextPut: 243;<br>
-               nextPut: distanceMod256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4&gt;&gt;genBranchPopTrueLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genBranchPopTrueLong: distance<br>
+       &quot;243            11110011        i i i i i i i i Pop and Jump 0n True i i i i i i i i (+ Extend B * 256)&quot;<br>
+       | distanceMod256 |<br>
+       (distance &lt; 0 or: [distance &gt; 32767]) ifTrue:<br>
+               [^self outOfRangeError: &#39;distance&#39; index: distance range: 0 to: 32767].<br>
+       (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
+               [&quot;200-207       11001 i i i             Pop and Jump 0n True iii +1 (i.e., 1 through 8)&quot;<br>
+                stream nextPut: 199 + distance.<br>
+                ^self].<br>
+       distanceMod256 := (distance &lt; 0 or: [distance &gt; 255])<br>
+                                                               ifTrue:<br>
+                                                                       [self genUnsignedSingleExtendB: (distance bitShift: -8).<br>
+                                                                        distance bitAnd: 255]<br>
+                                                               ifFalse: [distance].<br>
+       stream<br>
+               nextPut: 243;<br>
+               nextPut: distanceMod256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForNewsqueakV4&gt;&gt;genExt1: (in category &#39;bytecode generation&#39;) -----<br>
+ genExt1: aSmallInteger<br>
+       self shouldBeImplemented!<br>
<br>
Item was added:<br>
+ BytecodeEncoder subclass: #EncoderForSistaV1<br>
+       instanceVariableNames: &#39;&#39;<br>
+       classVariableNames: &#39;&#39;<br>
+       poolDictionaries: &#39;&#39;<br>
+       category: &#39;BytecodeSets-SistaV1&#39;!<br>
+<br>
+ !EncoderForSistaV1 commentStamp: &#39;eem 4/16/2014 14:44&#39; prior: 0!<br>
+ EncoderForSistaV1 encodes a bytecode set for Sista, the Speculative Inlining Smalltalk Architecture, a project by Clément Bera and Eliot Miranda.  Sista is an optimizer that exists in the Smalltalk image, /not/ in the VM,  and optimizes by substituting normal bytecoded methods by optimized bytecoded methods that may use special bytecodes for which the Cogit can generate faster code.  These bytecodes eliminate overheads such as bounds checks or polymorphic code (indexing Array, ByteArray, String etc).  But the bulk of the optimization performed is in inlining blocks and sends for the common path.  This bytecode set therefore differs from a normal Smalltalk set in providing a set of inlined primitives that do not validate their arguments that the compiler generates only when it can prove that the primitives&#39; arguments are valid.<br>


+<br>
+ The basic scheme is that the Cogit generates code containing performance counters.  When these counters trip, a callback into the image is performed, at which point Sista analyses some portion of the stack, looking at performance data for the methods on the stack, and optimises based on the stack and performance data.  Execution then resumes in the optimized code.<br>


+<br>
+ The Sista Cogit (e.g. SistaStackToRegisterMappingCogit) adds counters to conditional branches.  Each branch has an executed and a taken count.  On execution the executed count is decremented and if the count goes below zero the VM sends a message at a special index in the specialObjectsArray (as of writing, conditionalCounterTrippedOn:).  Then if the branch is taken the taken count is decremented.  The two counter values allow the Sista optimizer to collect basic block execution paths and to know what are the &quot;hot&quot; paths through execution that are worth agressively optimizing.  Since conditional branches are about 1/6 as frequent as sends, and since they can be used to determine the hot path through code, they are a better choice to count than, for example, method or block entry.<br>


+<br>
+ The VM provides a primitive that fills an Array with the state of the counters, and the state of each linked send in a method.  Tthe optimizer obtains the branch and send data for a method via this primitive.<br>
+<br>
+<br>
+ This bytecde set encodes a bytecode set for Smalltalk that lifts limits on the number of literals and branch distances, and extended push integer and push character bytecodes.  Bytecodes are ordered by length to make decoding easier.  Bytecodes marked with an * are extensible via a prefix bytecode.<br>


+<br>
+ N.B.  Extension bytecodes can only come before extensible bytecodes, and only if valid (one cannot extend a bytecode extensible by Ext A with an Ext B).  An extensible bytecode consumes (and zeros) its extension(s).  Hence the hidden implicit variables holding extensions are always zero except after a valid sequence of extension bytecodes.<br>


+<br>
+ Instance Variables (inherited)<br>
+<br>
+ 1 Byte Bytecodes<br>
+       0-15            0000 iiii                       Push Receiver Variable #iiii<br>
+       16-31           0001 iiii                       Push Literal Variable #iiii<br>
+       32-63           001 iiiii                               Push Literal #iiiii<br>
+       64-71           01000 iii                       Push Temp #iii<br>
+       72-75           010010 ii                       Push Temp #ii + 8<br>
+       76                      01001100                        Push Receiver<br>
+       77                      01001101                        Push true<br>
+       78                      01001110                        Push false<br>
+       79                      01001111                        Push nil<br>
+       80                      01010000                        Push 0<br>
+       81                      01010001                        Push 1<br>
+ *     82                      01010010                        Push thisContext, (then e.g. Extend 1 = push thisProcess)<br>
+       83                      01010011                        Duplicate Stack Top<br>
+       84-87           010101 ii                       UNASSIGNED<br>
+       88-91           010110 ii                       Return Receiver/true/false/nil<br>
+       92                      01011100                        Return top<br>
+       93                      01011101                        BlockReturn nil<br>
+ *     94                      01011110                        BlockReturn Top [* return from enclosing block N, N = Extend A, then jump by Ext B ]<br>
+ *     95                      01011111                        Nop<br>
+       96-111          0110 iiii                       Send Arithmetic Message #iiii #(#+ #- #&lt; #&gt; #&#39;&lt;=&#39; #&#39;&gt;=&#39; #= #&#39;~=&#39; #* #/ #&#39;\\&#39; #@ #bitShift: #&#39;//&#39; #bitAnd: #bitOr:)<br>


+       112-119 01110 iii                       Send Special Message #iii #(#at: #at:put: #size #next #nextPut: #atEnd #&#39;==&#39; class)<br>
+       120             01111000                        UNASSIGNED (was: blockCopy:)<br>
+       121             01111001                        Send Special Message #value<br>
+       122-123 0111101 i                       Send Special Message #i #(#value: #do:)<br>
+       124-127 011111 ii                       Send Special Message #ii #(#new #new: #x #y))<br>
+       128-143 1000 iiii                       Send Literal Selector #iiii With 0 Argument<br>
+       144-159 1001 iiii                       Send Literal Selector #iiii With 1 Arguments<br>
+       160-175 1010 iiii                       Send Literal Selector #iiii With 2 Arguments<br>
+       176-183 10110 iii                       Jump iii + 1 (i.e., 1 through 8)<br>
+       184-191 10111 iii                       Pop and Jump 0n True iii +1 (i.e., 1 through 8)<br>
+       192-199 11000 iii                       Pop and Jump 0n False iii +1 (i.e., 1 through 8)<br>
+       200-207 11001 iii                       Pop and Store Receiver Variable #iii<br>
+       208-215 11010 iii                       Pop and Store Temporary Variable #iii<br>
+       216             11011000                        Pop Stack Top<br>
+       217             11011001                        UNASSIGNED<br>
+       218-219 1101101 i                       UNASSIGNED<br>
+       220-223 110111 ii                       UNASSIGNED<br>
+<br>
+ 2 Byte Bytecodes<br>
+ *     224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+ *     225             11100001        bbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+ *     226             11100010        iiiiiiii                Push Receiver Variable #iiiiiiii (+ Extend A * 256)<br>
+ *     227             11100011        iiiiiiii                Push Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+ *     228             11100100        iiiiiiii                Push Literal #iiiiiiii (+ Extend A * 256)<br>
+       229             11100101        iiiiiiii                Push Temporary Variable #iiiiiiii<br>
+       230             11100110        iiiiiiii                PushNClosureTemps iiiiiiii<br>
+       231             11100111        jkkkkkkk        Push (Array new: kkkkkkk) (j = 0)<br>
+                                                                       &amp;       Pop kkkkkkk elements into: (Array new: kkkkkkk) (j = 1)<br>
+ *     232             11101000        iiiiiiii                Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)<br>
+ *     233             11101001        iiiiiiii                Push Character #iiiiiiii (+ Extend B * 256)<br>
+ **    234             11101010        iiiiijjj                Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+ **    235             11101011        iiiiijjj                Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+ *     236             11101100        iiiiiiii                Trap On Behavior/Array Of Behavior #iiiiiiii (+ Extend A * 256, where Extend A &gt;= 0)<br>
+ *     237             11101101        iiiiiiii                Jump #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)<br>
+ *     238             11101110        iiiiiiii                Pop and Jump 0n True #iiiiiiii (+ Extend B * 256, where Extend B &gt;= 0)<br>
+ *     239             11101111        iiiiiiii                Pop and Jump 0n False #iiiiiiii (+ Extend B * 256, where Extend B &gt;= 0)<br>
+ *     240             11110000        iiiiiiii                Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+ *     241             11110001        iiiiiiii                Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+       242             11110010        iiiiiiii                Pop and Store Temporary Variable #iiiiiiii<br>
+ *     243             11110011        iiiiiiii                Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+ *     244             11110100        iiiiiiii                Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+       245             11110110        iiiiiiii                Store Temporary Variable #iiiiiiii<br>
+       246-247 1111011 i       xxxxxxxx        UNASSIGNED<br>
+<br>
+ 3 Byte Bytecodes<br>
+       248             11111000        iiiiiiii                mjjjjjjj                Call Primitive #iiiiiiii + (jjjjjjj * 256) m=1 means inlined primitive, no hard return after execution.<br>
+       249             11111001        xxxxxxxx        syyyyyyy        Reserved for Push Float<br>
+ **    250             11111010        eeiiikkk                jjjjjjjj                Push Closure Num Copied iii (+ExtA//16*8) Num Args kkk (+ ExtA\\16*8) BlockSize jjjjjjjj (+ExtB*256). ee = num extensions<br>
+       251             11111011        kkkkkkkk        jjjjjjjj                Push Temp At kkkkkkkk In Temp Vector At: jjjjjjjj<br>
+       252             11111100        kkkkkkkk        jjjjjjjj                Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj<br>
+       253             11111101        kkkkkkkk        jjjjjjjj                Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj<br>
+       254-255 1111111i        xxxxxxxx        yyyyyyyy        UNASSIGNED<br>
+<br>
+ The Call Primitive Bytecode specifies either a primitive in the primitive table (m=0) or an inlined primitive (m=1). Non-inlined primtiives from the primitive table have index (jjjjjjj * 256) + iiiiiiii and return from the method if they succeed.  This bytecode is only valid as the first bytecode of a method.  Inline primitives have index (jjjjjjj * 256) + iiiiiiii, cannot fail, and do not return when they succeed, yielding a result (typically on top of stack after popping their arguments, but possibly in a byte data stack, for example for unboxed floating-point primitives).<br>


+<br>
+ We define the following inlined primitives:<br>
+ 0     unchecked SmallInteger #+.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 1     unchecked SmallInteger #-.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 2     unchecked SmallInteger #*.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 3     unchecked SmallInteger #/.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 4     unchecked SmallInteger #//.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 5     unchecked SmallInteger #\\.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 6     unchecked SmallInteger #rem:.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+<br>
+ 16    unchecked SmallInteger #bitAnd:.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 17    unchecked SmallInteger #bitOr:.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 18    unchecked SmallInteger #bitXor:.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+ 19    unchecked SmallInteger #bitShift:.  Both arguments are SmallIntegers and the result fits in a SmallInteger (* depends on word size)<br>
+<br>
+ 32    unchecked SmallInteger #&gt;.  Both arguments are SmallIntegers<br>
+ 33    unchecked SmallInteger #&lt;.  Both arguments are SmallIntegers<br>
+ 34    unchecked SmallInteger #&gt;=.  Both arguments are SmallIntegers<br>
+ 35    unchecked SmallInteger #&lt;=.  Both arguments are SmallIntegers<br>
+ 36    unchecked SmallInteger #=.  Both arguments are SmallIntegers<br>
+ 37    unchecked SmallInteger #!!=.  Both arguments are SmallIntegers<br>
+<br>
+ 64    unchecked Pointer Object&gt;&gt;at:.          The receiver is guaranteed to be a pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger<br>
+ 65    unchecked Byte Object&gt;&gt;at:.                     The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The result is a SmallInteger.<br>
+ 66    unchecked Word Object&gt;&gt;at:.                     The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The result is a SmallInteger.<br>
+ 67    unchecked DoubleWord Object&gt;&gt;at:.       The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The result is a SmallInteger or a LargePositiveInteger.<br>


+ 67    unchecked QuadWord Object&gt;&gt;at:.         The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The result is a SmallInteger or a LargePositiveInteger.<br>


+<br>
+ 80    unchecked Pointer Object&gt;&gt;at:put:.                      The receiver is guaranteed to be a pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger<br>
+ 81    unchecked Byte Object&gt;&gt;at:put:.                 The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The argument is a SmallInteger.  The primitive stores the least significant 8 bits.<br>


+ 82    unchecked Word Object&gt;&gt;at:put:.                 The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The argument is a SmallInteger.  The primitive stores the least significant 16 bits.<br>


+ 83    unchecked DoubleWord Object&gt;&gt;at:put:.   The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The argument is a SmallInteger.  The primitive stores the least significant 32 bits.<br>


+ 83    unchecked QuadWord Object&gt;&gt;at:put:.             The receiver is guaranteed to be a non-pointer object.  The 0-relative (1-relative?) index is an in-range SmallInteger.  The argument is a SmallInteger.  The primitive stores the least significant 64 bits.!<br>


<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;bindingReadScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ bindingReadScanBlockFor: litVarIndex using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for reads of the value of the binding with zero-relative index litVarIndex.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;       16-31           0001 i i i i                            Push Literal Variable #iiii<br>
+        *      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      227             11100011        i i i i i i i i Push Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b &lt; 32 and: [b &gt;= 16 and: [b - 16 = litVarIndex]])<br>
+           or: [b = 227<br>
+                       and: [scanner followingByte + prevext = litVarIndex]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;bindingWriteScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ bindingWriteScanBlockFor: litVarIndex using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for writes of the value of the binding with zero-relative index litVarIndex.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;*      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      241             11110001        iiiiiiii                Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+        *      244             11110100        iiiiiiii                Store Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b = 241 or: [b = 244])<br>
+          and: [scanner followingByte + prevext = litVarIndex]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;bytecodeSize: (in category &#39;instruction stream support&#39;) -----<br>
+ bytecodeSize: bytecode<br>
+       &quot;Answer the number of bytes in the bytecode.&quot;<br>
+       bytecode &lt; 224 ifTrue: [^1].<br>
+       bytecode &lt; 248 ifTrue: [^2].<br>
+       ^3!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;callPrimitiveCode (in category &#39;bytecode decoding&#39;) -----<br>
+ callPrimitiveCode<br>
+       &quot;Answer the call primitive bytecode, if it exists in the encoder&#39;s bytecode set, or nil if not.<br>
+        248    11111000        iiiiiiii        mjjjjjjj        Call Primitive #iiiiiiii + (jjjjjjj * 256) m=1 means inlined primitive, no hard return after execution.&quot;<br>
+       ^248!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;createClosureScanBlock (in category &#39;compiled method support&#39;) -----<br>
+ createClosureScanBlock<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for block closure creation bytecodes.  ote that with this interface we can&#39;t answer<br>
+        true for the extension in front of a push closure bytecode and so the interface may<br>
+        have to change at some point.&quot;<br>
+<br>
+       &quot;*      224     11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      225             11100001        bbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        **     250             11111010        eeiiikkk                jjjjjjjj                Push Closure Num Copied iii (+ExtA//16*8) Num Args kkk (+ ExtA\\16*8) BlockSize jjjjjjjj (+ExtB*256). ee = num extensions&quot;<br>


+       ^[:b| b = 250]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;extensionsAt:in:into: (in category &#39;compiled method support&#39;) -----<br>
+ extensionsAt: bcpc in: method into: aTrinaryBlock<br>
+       &quot;If the bytecode at pc is an extension then evaluate aBinaryBlock with the values of extA and extB and number of extension *bytes*.<br>
+        If the bytecode at pc is not extended then evaluate aBinaryBlock with 0 and 0.<br>
+       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       225             11100001        bbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)&quot;<br>
+<br>
+       | scanpc byte extByte extA extB |<br>
+       scanpc := bcpc.<br>
+       &quot;There may be an extension (it could be a false positive).  We must scan as fast as possible...&quot;<br>
+       extA := extB := 0.<br>
+       [byte := method at: scanpc.<br>
+        byte &gt;= 224 and: [byte &lt;= 225]] whileTrue:<br>
+               [extByte := method at: scanpc + 1.<br>
+                scanpc := scanpc + 2.<br>
+                byte = 224<br>
+                       ifTrue:<br>
+                               [extA := (extA bitShift: 8) + extByte]<br>
+                       ifFalse:<br>
+                               [extB := (extB = 0 and: [extByte &gt; 127])<br>
+                                       ifTrue: [extByte - 256]<br>
+                                       ifFalse: [(extB bitShift: 8) + extByte]]].<br>
+       ^aTrinaryBlock value: extA value: extB value: scanpc - bcpc<br>
+<br>
+<br>
+ &quot;Why use<br>
+       byte &gt;= 224 and: [byte &lt;= 225]<br>
+  and not<br>
+       (byte bitAnd: 16rFE) = 16rE0<br>
+  ?<br>
+  | n |<br>
+  n := 100000000.<br>
+  #(0 224) collect:<br>
+       [:byte|<br>
+       { Time millisecondsToRun: [1 to: n do: [:i| (byte &gt;= 224 and: [byte &lt;= 225]) ifTrue: []]].<br>
+          Time millisecondsToRun: [1 to: n do: [:i| (byte bitAnd: 16rFE) = 16rE0 ifTrue: []]] }] #(#(297 599) #(702 671))&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;instVarReadScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ instVarReadScanBlockFor: varIndexCode using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for reads of the inst var with zero-relative index varIndexCode.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;       0-15            0000 i i i i                            Push Receiver Variable #iiii<br>
+       *       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       *       226             11100010        i i i i i i i i Push Receiver Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b &lt; 16 and: [b = varIndexCode])<br>
+           or: [b = 226<br>
+                       and: [scanner followingByte + prevext = varIndexCode]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;instVarWriteScanBlockFor:using: (in category &#39;compiled method support&#39;) -----<br>
+ instVarWriteScanBlockFor: varIndexCode using: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor: that answers true<br>
+        for writes of the inst var with zero-relative index varIndexCode.<br>
+        N.B. Don&#39;t assume the compiler uses the most compact encoding available.&quot;<br>
+<br>
+       &quot;       200-207 11001 iii                       Pop and Store Receiver Variable #iii<br>
+       *       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       *       240             11110000        iiiiiiii                Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+       *       243             11110011        iiiiiiii                Store Receiver Variable #iiiiiii (+ Extend A * 256)&quot;<br>
+       | extension |<br>
+       extension := 0.<br>
+       ^[:b| | prevext |<br>
+          prevext := extension.<br>
+          extension := b = 224 ifTrue: [scanner followingByte bitShift: 8] ifFalse: [0].<br>
+          (b &gt;= 200<br>
+           and: [b &lt; 208<br>
+           and: [b - 200 = varIndexCode]])<br>
+          or: [(b = 240 or: [b = 243])<br>
+                 and: [scanner followingByte + prevext = varIndexCode]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;interpretJumpIfCondIn: (in category &#39;compiled method support&#39;) -----<br>
+ interpretJumpIfCondIn: anInstructionStream<br>
+       &quot;Double-dispatch through the encoder to select the correct conditional jump decoder for the instruction set.&quot;<br>
+       ^anInstructionStream interpretSistaV1JumpIfCond!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;interpretJumpIn: (in category &#39;compiled method support&#39;) -----<br>
+ interpretJumpIn: anInstructionStream<br>
+       &quot;Double-dispatch through the encoder to select the correct unconditional jump decoder for the instruction set.&quot;<br>
+       ^anInstructionStream interpretSistaV1Jump!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;interpretNextInstructionFor:in: (in category &#39;instruction stream support&#39;) -----<br>
+ interpretNextInstructionFor: aClient in: anInstructionStream<br>
+       &quot;Double-dispatch through the encoder to select the correct instruction set decoder.&quot;<br>
+       ^anInstructionStream interpretNextSistaV1InstructionFor: aClient!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isBlockReturnAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isBlockReturnAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a return from block.&quot;<br>
+       &quot;       93                      01011101                        BlockReturn nil<br>
+        *      94                      01011110                        BlockReturn Top [* return from enclosing block N, N = Extend A, then jump by Ext B ]&quot;<br>
+       ^(self nonExtensionBytecodeAt: pc in: method) between: 93 and: 94!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isBranchIfFalseAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isBranchIfFalseAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a conditional branch-if-false.&quot;<br>
+<br>
+       &quot;       192-199 11000 iii                               Pop and Jump 0n False iii +1 (i.e., 1 through 8)<br>
+        *      239             11101111        iiiiiiii                Pop and Jump 0n False #iiiiiiii (+ Extend B * 256, where Extend B &gt;= 0)&quot;<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 192 and: [byte &lt;= 199 or: [byte = 239]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isBranchIfTrueAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isBranchIfTrueAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a conditional branch-if-true.&quot;<br>
+<br>
+       &quot;       184-191 10111 iii                               Pop and Jump 0n True iii +1 (i.e., 1 through 8)<br>
+        *      238             11101110        iiiiiiii                Pop and Jump 0n True #iiiiiiii (+ Extend B * 256, where Extend B &gt;= 0))&quot;<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 184 and: [byte &lt;= 191 or: [byte = 238]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isExtension: (in category &#39;instruction stream support&#39;) -----<br>
+ isExtension: bytecode<br>
+       &quot;Answer if the bytecode is an extension bytecode, i.e. one that extends<br>
+        the range of the following bytecode.&quot;<br>
+       ^bytecode &gt;= 16rE0 and: [bytecode &lt;= 16rE1]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isJumpAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isJumpAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is an (unconditional) jump.&quot;<br>
+<br>
+       &quot;       176-183 10110 iii                               Jump iii + 1 (i.e., 1 through 8)<br>
+        *      225             11100001        bbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        *      237             11101101        iiiiiiii                Jump #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 176 and: [byte &lt;= 183 or: [byte = 237]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isJustPopAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isJustPopAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a pop.&quot;<br>
+<br>
+       ^(method at: pc) = 216 &quot;216             11011000                        Pop Stack Top&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isRealSendAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isRealSendAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a real message-send, not blockCopy:.&quot;<br>
+<br>
+       ^self isSendAt: pc in: method!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isReturnAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isReturnAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a return from block.&quot;<br>
+       &quot;       88-91           010110 ii                       Return Receiver/true/false/nil<br>
+               92                      01011100                        Return top<br>
+               93                      01011101                        BlockReturn nil<br>
+        *      94                      01011110                        BlockReturn Top [* return from enclosing block N, N = Extend A, then jump by Ext B ]&quot;<br>
+       ^(self nonExtensionBytecodeAt: pc in: method) between: 88 and: 94!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isSendAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isSendAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a message-send.&quot;<br>
+<br>
+       &quot;       96-111          0110 iiii                       Send Arithmetic Message #iiii #(#+ #- #&lt; #&gt; #&#39;&lt;=&#39; #&#39;&gt;=&#39; #= #&#39;~=&#39; #* #/ #&#39;\\&#39; #@ #bitShift: #&#39;//&#39; #bitAnd: #bitOr:)<br>


+               112-119 01110 iii                       Send Special Message #iii #(#at: #at:put: #size #next #nextPut: #atEnd #&#39;==&#39; class)<br>
+               120             01111000                        UNASSIGNED (was: blockCopy:)<br>
+               121             01111001                        Send Special Message #value<br>
+               122-123 0111101 i                       Send Special Message #i #(#value: #do:)<br>
+               124-127 011111 ii                       Send Special Message #ii #(#new #new: #x #y))<br>
+               128-143 1000 iiii                       Send Literal Selector #iiii With 0 Argument<br>
+               144-159 1001 iiii                       Send Literal Selector #iiii With 1 Arguments<br>
+               160-175 1010 iiii                       Send Literal Selector #iiii With 2 Arguments<br>
+        **     234             11101010        iiiiijjj        Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments<br>
+        **     235             11101011        iiiiijjj        Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments&quot;<br>
+<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 96<br>
+         and: [byte &lt;= 175<br>
+                or: [byte &gt;= 234 and: [byte &lt;= 235]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isStoreAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isStoreAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a store or store-pop.&quot;<br>
+<br>
+       &quot;       200-207 11001 iii                                               Pop and Store Receiver Variable #iii<br>
+               208-215 11010 iii                                               Pop and Store Temporary Variable #iii<br>
+        *      224             11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      240             11110000        iiiiiiii                                Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+        *      241             11110001        iiiiiiii                                Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+               242             11110010        iiiiiiii                                Pop and Store Temporary Variable #iiiiiiii<br>
+        *      243             11110011        iiiiiiii                                Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+        *      244             11110100        iiiiiiii                                Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+               245             11110110        iiiiiiii                                Store Temporary Variable #iiiiiiii<br>
+<br>
+               252             11111100        kkkkkkkk        jjjjjjjj        Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj<br>
+               253             11111101        kkkkkkkk        jjjjjjjj        Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 200<br>
+         and: [byte &lt;= 215<br>
+                or: [(byte between: 240 and: 245)<br>
+                or: [(byte between: 252 and: 253)]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;isStorePopAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ isStorePopAt: pc in: method<br>
+       &quot;Answer whether the bytecode at pc is a store or store-pop.&quot;<br>
+<br>
+       &quot;       200-207 11001 iii                                               Pop and Store Receiver Variable #iii<br>
+               208-215 11010 iii                                               Pop and Store Temporary Variable #iii<br>
+        *      224             11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      240             11110000        iiiiiiii                                Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)<br>
+        *      241             11110001        iiiiiiii                                Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)<br>
+               242             11110010        iiiiiiii                                Pop and Store Temporary Variable #iiiiiiii<br>
+<br>
+               253             11111101        kkkkkkkk        jjjjjjjj        Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+<br>
+       | byte |<br>
+       byte := self nonExtensionBytecodeAt: pc in: method.<br>
+       ^byte &gt;= 200<br>
+         and: [byte &lt;= 215<br>
+                or: [(byte between: 240 and: 242)<br>
+                or: [byte = 253]]]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;method:refersInBytecodeToLiteral:specialSelectorIndex: (in category &#39;scanning&#39;) -----<br>
+ method: method refersInBytecodeToLiteral: aLiteral specialSelectorIndex: specialOrNil<br>
+       &quot;Answer if method refers to the literal aLiteral in the bytecode, as opposed to in its literal frame.&quot;<br>
+<br>
+       &quot;       77                      01001101                                Push true<br>
+               78                      01001110                                Push false<br>
+               79                      01001111                                Push nil<br>
+               80                      01010000                                Push 0<br>
+               81                      01010001                                Push 1<br>
+               88-91           010110 ii                               Return Receiver/true/false/nil<br>
+               93                      01011101                                BlockReturn nil<br>
+               96-111          0110 iiii                               Send Arithmetic Message #iiii #(#+ #- #&lt; #&gt; #&#39;&lt;=&#39; #&#39;&gt;=&#39; #= #&#39;~=&#39; #* #/ #&#39;\\&#39; #@ #bitShift: #&#39;//&#39; #bitAnd: #bitOr:)<br>


+               112-119 01110 iii                               Send Special Message #iii #(#at: #at:put: #size #next #nextPut: #atEnd #&#39;==&#39; class)<br>
+               120             01111000                                UNASSIGNED (was: blockCopy:)<br>
+               121             01111001                                Send Special Message #value<br>
+               122-123 0111101 i                               Send Special Message #i #(#value: #do:)<br>
+               124-127 011111 ii                               Send Special Message #ii #(#new #new: #x #y))<br>
+       *       224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+       *       225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+       *       232             11101000        iiiiiiii                Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)<br>
+       *       233             11101001        iiiiiiii                Push Character #iiiiiiii (+ Extend B * 256)<br>
+               249             11111001        xxxxxxxx        syyyyyyy        Reserved for Push Float&quot;<br>
+       | byte extended scanner |<br>
+       specialOrNil ifNotNil:<br>
+               [byte := specialOrNil + 95.<br>
+               ^(InstructionStream on: method) scanFor: [:b| b = byte]].<br>
+       extended := false.<br>
+       aLiteral isInteger ifTrue:<br>
+               [(aLiteral &gt;= -32768 and: [aLiteral &lt;= 32767]) ifFalse: [^false].<br>
+                scanner := InstructionStream on: method.<br>
+                (aLiteral &gt;= 0 and: [aLiteral &lt;= 255]) ifTrue:<br>
+                       [aLiteral &lt;= 1 ifTrue:<br>
+                               [byte := aLiteral + 80.<br>
+                                ^scanner scanFor: [:b| b = byte]].<br>
+                        ^scanner scanFor:<br>
+                               [:b|<br>
+                               (b = 232<br>
+                                and: [extended not<br>
+                                and: [scanner followingByte = aLiteral]])<br>
+                               or: [extended := b = 225.<br>
+                                       false]]].<br>
+                byte := (aLiteral bitShift: -8) bitAnd: 255.<br>
+               ^scanner scanFor:<br>
+                       [:b|<br>
+                       (b = 232<br>
+                        and: [extended<br>
+                        and: [scanner followingByte = (aLiteral bitAnd: 255)]])<br>
+                       or: [extended := b = 225 and: [scanner followingByte = byte].<br>
+                               false]]].<br>
+       aLiteral isCharacter ifTrue:<br>
+               [aLiteral asciiValue &lt;= 65535 ifFalse: [^false].<br>
+                scanner := InstructionStream on: method.<br>
+                aLiteral asciiValue &lt;= 255 ifTrue:<br>
+                       [^scanner scanFor:<br>
+                               [:b|<br>
+                               (b = 233<br>
+                                and: [extended not<br>
+                                and: [scanner followingByte = aLiteral]])<br>
+                               or: [extended := b = 225.<br>
+                                       false]]].<br>
+                byte := (aLiteral bitShift: -8) bitAnd: 255.<br>
+               ^scanner scanFor:<br>
+                       [:b|<br>
+                       (b = 233<br>
+                        and: [extended<br>
+                        and: [scanner followingByte = (aLiteral bitAnd: 255)]])<br>
+                       or: [extended := b = 225 and: [scanner followingByte = byte].<br>
+                               false]]].<br>
+       aLiteral == nil ifTrue:<br>
+               [^(InstructionStream on: method) scanFor: [:b| b = 79 or: [b = 91 or: b = 93]]].<br>
+       aLiteral == true ifTrue:<br>
+               [^(InstructionStream on: method) scanFor: [:b| b = 77 or: [b = 89]]].<br>
+       aLiteral == false ifTrue:<br>
+               [^(InstructionStream on: method) scanFor: [:b| b = 78 or: [b = 90]]].<br>
+<br>
+       ^false!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;nonExtensionBytecodeAt:in: (in category &#39;instruction stream support&#39;) -----<br>
+ nonExtensionBytecodeAt: pc in: method<br>
+       &quot;Answer the actual bytecode at pc in method, skipping past any preceeding extensions.&quot;<br>
+       | thePC bytecode |<br>
+       thePC := pc.<br>
+       [self isExtension: (bytecode := method at: thePC)] whileTrue:<br>
+               [thePC := thePC + (self bytecodeSize: bytecode)].<br>
+       ^bytecode!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;pcOfBlockCreationBytecodeForBlockStartingAt:in: (in category &#39;bytecode decoding&#39;) -----<br>
+ pcOfBlockCreationBytecodeForBlockStartingAt: startpc in: method<br>
+       &quot;Answer the pc of the push closure bytecode whose block starts at startpc in method.<br>
+        May need to back up to include extension bytecodes.&quot;<br>
+<br>
+       &quot;*      224             11100000        aaaaaaaa                        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      225             11100001        bbbbbbbb                        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        **     250             11111010        eeiiikkk                jjjjjjjj        Push Closure Num Copied iii (+ExtA//16*8) Num Args kkk (+ ExtA\\16*8) BlockSize jjjjjjjj (+ExtB*256). ee = num extensions&quot;<br>
+       | numExtensions |<br>
+       self assert: (method at: startpc - 3) = 250.<br>
+       numExtensions := (method at: startpc - 2) &gt;&gt; 6.<br>
+       ^startpc - 3 - (numExtensions * 2)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;pushClosureBytecodeSize (in category &#39;bytecode decoding&#39;) -----<br>
+ pushClosureBytecodeSize<br>
+       &quot;Answer the size of the push closure bytecode.<br>
+        **     250             11111010        eeiiikkk                jjjjjjjj        Push Closure Num Copied iii (+ExtA//16*8) Num Args kkk (+ ExtA\\16*8) BlockSize jjjjjjjj (+ExtB*256). ee = num extensions&quot;<br>
+       ^3!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;superSendScanBlockUsing: (in category &#39;instruction stream support&#39;) -----<br>
+ superSendScanBlockUsing: scanner<br>
+       &quot;Answer a block argument for InstructionStream&gt;&gt;scanFor:<br>
+        that answers true for super sends.&quot;<br>
+<br>
+       &quot;*      224             11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        **     235             11101011        iiiiijjj                Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments&quot;<br>
+<br>
+       ^[:instr | instr = 235]!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;supportsClosures (in category &#39;compiled method support&#39;) -----<br>
+ supportsClosures<br>
+       &quot;Answer if the instruction set supports closures (contains<br>
+        closure creation and indirect temp access bytecodes).&quot;<br>
+<br>
+       ^true!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1 class&gt;&gt;unusedBytecode (in category &#39;bytecode decoding&#39;) -----<br>
+ unusedBytecode<br>
+       &quot;Answer the opcode of a single-byte unused bytecode, if it exists in the encoder&#39;s bytecode set, or nil if not.&quot;<br>
+       ^223!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genBranchPopFalse: (in category &#39;bytecode generation&#39;) -----<br>
+ genBranchPopFalse: distance<br>
+       (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
+               [&quot;192-199       11000 iii                       Pop and Jump 0n False iii + 1 (i.e., 1 through 8)&quot;<br>
+                stream nextPut: 191 + distance.<br>
+                ^self].<br>
+       ^self genBranchPopFalseLong: distance!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genBranchPopFalseLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genBranchPopFalseLong: distance<br>
+       &quot;239            11101111        iiiiiiii                Pop and Jump 0n False #iiiiiiii (+ Extend B * 256, where Extend B &gt;= 0) &quot;<br>
+       | distanceMod256 |<br>
+       (distance &lt; 0 or: [distance &gt; 32767]) ifTrue:<br>
+               [^self outOfRangeError: &#39;distance&#39; index: distance range: 0 to: 32767].<br>
+       distanceMod256 := (distance &lt; 0 or: [distance &gt; 255])<br>
+                                                       ifTrue:<br>
+                                                               [self genUnsignedSingleExtendB: (distance bitShift: -8).<br>
+                                                                distance bitAnd: 255]<br>
+                                                       ifFalse: [distance].<br>
+       stream<br>
+               nextPut: 239;<br>
+               nextPut: distanceMod256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genBranchPopTrue: (in category &#39;bytecode generation&#39;) -----<br>
+ genBranchPopTrue: distance<br>
+       (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
+               [&quot;184-191       10111 iii                       Pop and Jump 0n True iii + 1 (i.e., 1 through 8)&quot;<br>
+                stream nextPut: 183 + distance.<br>
+                ^self].<br>
+       ^self genBranchPopTrueLong: distance!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genBranchPopTrueLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genBranchPopTrueLong: distance<br>
+       &quot;238            11101110        iiiiiiii                Pop and Jump 0n True #iiiiiiii (+ Extend B * 256, where Extend B &gt;= 0)&quot;<br>
+       | distanceMod256 |<br>
+       (distance &lt; 0 or: [distance &gt; 32767]) ifTrue:<br>
+               [^self outOfRangeError: &#39;distance&#39; index: distance range: 0 to: 32767].<br>
+       (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
+               [&quot;184-191       10111 iii                       Pop and Jump 0n True iii + 1 (i.e., 1 through 8)&quot;<br>
+                stream nextPut: 183 + distance.<br>
+                ^self].<br>
+       distanceMod256 := (distance &lt; 0 or: [distance &gt; 255])<br>
+                                                       ifTrue:<br>
+                                                               [self genUnsignedSingleExtendB: (distance bitShift: -8).<br>
+                                                                distance bitAnd: 255]<br>
+                                                       ifFalse: [distance].<br>
+       stream<br>
+               nextPut: 238;<br>
+               nextPut: distanceMod256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genCallInlinePrimitive: (in category &#39;bytecode generation&#39;) -----<br>
+ genCallInlinePrimitive: primitiveIndex<br>
+       &quot;248            11111000        i i i i i i i i 1jjjjjjj                Call Primitive #iiiiiiii + (jjjjjjj * 256)&quot;<br>
+       &quot;N.B. We could have made CallPrimitive a 2-byte code taking an extension, but that would<br>
+        complicate the VM&#39;s determination of the primitive number and the primitive error code<br>
+        store since the extension, being optional, would make the sequence variable length.&quot;<br>
+       (primitiveIndex &lt; 1 or: [primitiveIndex &gt; 32767]) ifTrue:<br>
+               [self outOfRangeError: &#39;primitive index&#39; index: primitiveIndex range: 1 to: 32767].<br>
+       stream<br>
+               nextPut: 248;<br>
+               nextPut: (primitiveIndex bitAnd: 255);<br>
+               nextPut: (primitiveIndex bitShift: -8) + 128!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genCallPrimitive: (in category &#39;bytecode generation&#39;) -----<br>
+ genCallPrimitive: primitiveIndex<br>
+       &quot;248            11111000        i i i i i i i i 0jjjjjjj                Call Primitive #iiiiiiii + (jjjjjjj * 256)&quot;<br>
+       &quot;N.B. We could have made CallPrimitive a 2-byte code taking an extension, but that would<br>
+        complicate the VM&#39;s determination of the primitive number and the primitive error code<br>
+        store since the extension, being optional, would make the sequence variable length.&quot;<br>
+       (primitiveIndex &lt; 1 or: [primitiveIndex &gt; 32767]) ifTrue:<br>
+               [self outOfRangeError: &#39;primitive index&#39; index: primitiveIndex range: 1 to: 32767].<br>
+       stream<br>
+               nextPut: 248;<br>
+               nextPut: (primitiveIndex bitAnd: 255);<br>
+               nextPut: (primitiveIndex bitShift: -8)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genDup (in category &#39;bytecode generation&#39;) -----<br>
+ genDup<br>
+       &quot;83                     01010011                        Duplicate Stack Top&quot;<br>
+       stream nextPut: 83!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genInlineSmallIntegerAdd (in category &#39;in-line primitive generation&#39;) -----<br>
+ genInlineSmallIntegerAdd<br>
+       ^self genCallInlinePrimitive: 0!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genJump: (in category &#39;bytecode generation&#39;) -----<br>
+ genJump: distance<br>
+       (distance &gt; 0 and: [distance &lt; 9]) ifTrue:<br>
+               [&quot;176-183       10110 iii                       Jump iii + 1 (i.e., 1 through 8)&quot;<br>
+                stream nextPut: 175 + distance.<br>
+                ^self].<br>
+       &quot;237            11101101        iiiiiiii                Jump #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       ^self genJumpLong: distance!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genJumpLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genJumpLong: distance<br>
+       &quot;237            11101101        iiiiiiii                Jump #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       (distance between: -32768 and: 32767) ifFalse:<br>
+               [^self outOfRangeError: &#39;index&#39; index: distance range: -32768 to: 32767].<br>
+       (distance &lt; 0 or: [distance &gt; 255]) ifTrue:<br>
+               [self genSignedSingleExtendB: (distance bitShift: -8)].<br>
+       stream<br>
+               nextPut: 237;<br>
+               nextPut: (distance bitAnd: 255)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genNop (in category &#39;bytecode generation&#39;) -----<br>
+ genNop<br>
+       &quot;95                     01011111                        Nop&quot;<br>
+       stream nextPut: 95!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPop (in category &#39;bytecode generation&#39;) -----<br>
+ genPop<br>
+       &quot;216            11011000                        Pop Stack Top&quot;<br>
+       stream nextPut: 216!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushCharacter: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushCharacter: aCharacterOrCode<br>
+       &quot;233            11101001        i i i i i i i i Push Character #iiiiiiii (+ Extend B * 256)&quot;<br>
+       &quot;Why restrict the range to 16 bits when we could encode arbitrarily 32-bit Characters?<br>
+        Well, 16 bits requires 4 bytes (extB + byte, 78 + byte) and so beyond this range we<br>
+        lose space verses a single-byte pushLiteral and a 4 byte Character literal on 32-bits.<br>
+        And generating the same bytecode on 64-bit and 32-bit is important if we want to be<br>
+        able to load binary code from one to the other (e.g. via Fuel).&quot;<br>
+       | code |<br>
+       code := aCharacterOrCode isInteger ifTrue: [aCharacterOrCode] ifFalse: [aCharacterOrCode asInteger].<br>
+       (code &lt; 0 or: [code &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;character&#39; index: code range: 0 to: 65535].<br>
+       (code &gt; 255) ifTrue:<br>
+               [self genUnsignedSingleExtendB: (code bitShift: -8)].<br>
+       stream<br>
+               nextPut: 233;<br>
+               nextPut: (code bitAnd: 255)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushClosureCopyNumCopiedValues:numArgs:jumpSize: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushClosureCopyNumCopiedValues: numCopied numArgs: numArgs jumpSize: jumpSize<br>
+       &quot;250            11111010 eeiiikkk               jjjjjjjj                Push Closure Num Copied iii (+ Ext A // 16 * 8) Num Args kkk (+ Ext A \\ 16 * 8) BlockSize jjjjjjjj (+ Ext B * 256). ee = num extensions&quot;<br>


+       &quot;Including numExtensions makes decoding the bytecode quicker since it obviates having to scan from the beginning of a method.&quot;<br>
+       | numExtensions numCopiedMod8 numArgsMod8 extA |<br>
+       (jumpSize &lt; 0 or: [jumpSize &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;block size&#39; index: jumpSize range: 0 to: 65535].<br>
+       (numCopied &lt; 0 or: [numCopied &gt; 127]) ifTrue:<br>
+               [^self outOfRangeError: &#39;num copied&#39; index: numCopied range: 0 to: 127].<br>
+       (numArgs &lt; 0 or: [numArgs &gt; 127]) ifTrue:<br>
+               [^self outOfRangeError: &#39;num args&#39; index: numArgs range: 0 to: 127].<br>
+       extA := numExtensions := 0.<br>
+       (numArgsMod8 := numArgs) &gt; 7 ifTrue:<br>
+               [extA := numArgs // 8.<br>
+                numArgsMod8 := numArgsMod8 \\ 8].<br>
+       (numCopiedMod8 := numCopied) &gt; 7 ifTrue:<br>
+               [extA := extA + (numCopied // 8 * 16).<br>
+                numCopiedMod8 := numCopiedMod8 \\ 8].<br>
+       extA ~= 0 ifTrue:<br>
+               [self genUnsignedSingleExtendA: extA.<br>
+                numExtensions := 1].<br>
+       jumpSize &gt; 255 ifTrue:<br>
+               [numExtensions := numExtensions + 1.<br>
+                self genUnsignedSingleExtendB: jumpSize // 256].<br>
+       stream<br>
+               nextPut: 250;<br>
+               nextPut: (numExtensions bitShift: 6) + (numCopiedMod8 bitShift: 3) + numArgsMod8;<br>
+               nextPut: (jumpSize bitAnd: 16rFF)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushConsArray: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushConsArray: size<br>
+       (size &lt; 0 or: [size &gt; 127]) ifTrue:<br>
+               [^self outOfRangeError: &#39;size&#39; index: size range: 0 to: 127].<br>
+       &quot;233            11101001        jkkkkkkk        Push (Array new: kkkkkkk) (j = 0)<br>
+                                                                       &amp;       Pop kkkkkkk elements into: (Array new: kkkkkkk) (j = 1)&quot;<br>
+       stream<br>
+               nextPut: 233;<br>
+               nextPut: size + 128!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushInstVar: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushInstVar: instVarIndex<br>
+       (instVarIndex between: 0 and: 15) ifTrue:<br>
+               [&quot;0-15  0000iiii        Push Receiver Variable #iiii&quot;<br>
+                stream nextPut: 0 + instVarIndex.<br>
+                ^self].<br>
+       self genPushInstVarLong: instVarIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushInstVarLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushInstVarLong: instVarIndex<br>
+       &quot;226            11100010        i i i i i i i i Push Receiver Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       &quot;See also MaybeContextInstanceVariableNode&quot;<br>
+       (instVarIndex &lt; 0 or: [instVarIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: instVarIndex range: 0 to: 65535].<br>
+       instVarIndex &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: instVarIndex // 256].<br>
+       stream<br>
+               nextPut: 226;<br>
+               nextPut: instVarIndex \\ 256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushInteger: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushInteger: anInteger<br>
+       &quot;80                     01010000                                Push 0<br>
+        81                     01010001                                Push 1<br>
+        232            11101000        i i i i i i i i Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       &quot;Why restrict the range to 16 bits when we could encode arbitrarily large integers?<br>
+        Well, 16 bits requires 4 bytes (extB + byte, 78 + byte) and so beyond this range we lose space<br>
+        verses a single-byte pushLiteral and a 4 byte integer literal on 32-bits.  And generating the same<br>
+        bytecode on 64-bit and 32-bit is important if we want to be able to load binary code from one to<br>
+        the other (e.g. via Fuel).&quot;<br>
+       anInteger = 0 ifTrue:<br>
+               [stream nextPut: 80.<br>
+                ^self].<br>
+       anInteger = 1 ifTrue:<br>
+               [stream nextPut: 81.<br>
+                ^self].<br>
+       (anInteger &lt; -32768 or: [anInteger &gt; 32767]) ifTrue:<br>
+               [^self outOfRangeError: &#39;integer&#39; index: anInteger range: -32768 to: 32767].<br>
+       (anInteger &lt; 0 or: [anInteger &gt; 255]) ifTrue:<br>
+               [self genSignedSingleExtendB: (anInteger bitShift: -8)].<br>
+       stream<br>
+               nextPut: 232;<br>
+               nextPut: (anInteger bitAnd: 255)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushLiteral: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushLiteral: literalIndex<br>
+       | extendedIndex |<br>
+       (literalIndex &lt; 0 or: [literalIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: literalIndex range: 0 to: 65536].<br>
+       literalIndex &lt; 32 ifTrue:<br>
+               [&quot;32-63         001iiiii        Push Literal #iiiii&quot;<br>
+                stream nextPut: 32 + literalIndex.<br>
+                ^self].<br>
+       &quot;228            11100100        i i i i i i i i Push Literal #iiiiiiii (+ Extend A * 256)&quot;<br>
+       (extendedIndex := literalIndex) &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: extendedIndex // 256.<br>
+                extendedIndex := extendedIndex \\ 256].<br>
+       stream<br>
+               nextPut: 228;<br>
+               nextPut: extendedIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushLiteralVar: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushLiteralVar: literalIndex<br>
+       | extendedIndex |<br>
+       (literalIndex &lt; 0 or: [literalIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: literalIndex range: 0 to: 65535].<br>
+       literalIndex &lt; 16 ifTrue:<br>
+               [&quot;16-31         0001 i i i i            Push Literal Variable #iiii&quot;<br>
+                stream nextPut: 16 + literalIndex.<br>
+                ^self].<br>
+       &quot;227            11100011        i i i i i i i i Push Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       (extendedIndex := literalIndex) &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: extendedIndex // 256.<br>
+                extendedIndex := extendedIndex \\ 256].<br>
+       stream<br>
+               nextPut: 227;<br>
+               nextPut: extendedIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushNewArray: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushNewArray: size<br>
+       (size &lt; 0 or: [size &gt; 127]) ifTrue:<br>
+               [^self outOfRangeError: &#39;size&#39; index: size range: 0 to: 127].<br>
+       &quot;231            11100111        jkkkkkkk        Push (Array new: kkkkkkk) (j = 0)<br>
+                                                                       &amp;       Pop kkkkkkk elements into: (Array new: kkkkkkk) (j = 1)&quot;<br>
+       stream<br>
+               nextPut: 231;<br>
+               nextPut: size!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushReceiver (in category &#39;bytecode generation&#39;) -----<br>
+ genPushReceiver<br>
+       &quot;76                     01001100                Push Receiver&quot;<br>
+       stream nextPut: 76!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushRemoteTemp:inVectorAt: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushRemoteTemp: tempIndex inVectorAt: tempVectorIndex<br>
+       &quot;251            11111011 kkkkkkkk       jjjjjjjj                Push Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+       (tempIndex &lt; 0 or: [tempIndex &gt;= 256]) ifTrue:<br>
+               [^self outOfRangeError: &#39;remoteTempIndex&#39; index: tempIndex range: 0 to: 255].<br>
+       (tempVectorIndex &lt; 0 or: [tempVectorIndex &gt;= 256]) ifTrue:<br>
+               [^self outOfRangeError: &#39;tempVectorIndex&#39; index: tempVectorIndex range: 0 to: 255].<br>
+       stream<br>
+               nextPut: 251;<br>
+               nextPut: tempIndex;<br>
+               nextPut: tempVectorIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushSpecialLiteral: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushSpecialLiteral: aLiteral<br>
+       &quot;77                     01001101                        Push true<br>
+        78                     01001110                        Push false<br>
+        79                     01001111                        Push nil<br>
+        80                     01010000                        Push 0<br>
+        81                     01010001                        Push 1<br>
+        232            11101000        iiiiiiii                Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       | index |<br>
+       aLiteral isInteger ifTrue:<br>
+               [aLiteral == 0 ifTrue:<br>
+                       [stream nextPut: 80.<br>
+                        ^self].<br>
+                aLiteral == 1 ifTrue:<br>
+                       [stream nextPut: 81.<br>
+                        ^self].<br>
+                ^self genPushInteger: aLiteral].<br>
+       index := #(false true nil)<br>
+                                       indexOf: aLiteral<br>
+                                       ifAbsent: [^self error: &#39;push special literal: &#39;, aLiteral printString,  &#39; is not one of true false nil&#39;].<br>
+       stream nextPut: 76 + index!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushTemp: (in category &#39;bytecode generation&#39;) -----<br>
+ genPushTemp: tempIndex<br>
+       (tempIndex &lt; 0 or: [tempIndex &gt; 63]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: tempIndex range: 0 to: 63].<br>
+       tempIndex &lt; 12 ifTrue:<br>
+               [&quot;64-71         01000 i i i             Push Temporary Variable #iii<br>
+                  72-75        010010 i i              Push Temporary Variable #ii + 8&quot;<br>
+                stream nextPut: 64 + tempIndex.<br>
+                ^self].<br>
+       &quot;229            11100101        i i i i i i i i Push Temporary Variable #iiiiiiii&quot;<br>
+       stream<br>
+               nextPut: 229;<br>
+               nextPut: tempIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genPushThisContext (in category &#39;bytecode generation&#39;) -----<br>
+ genPushThisContext<br>
+       &quot;82                     01010010                        Push thisContext, (then e.g. Extend 1 = push thisProcess)&quot;<br>
+       stream nextPut: 82!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genReturnReceiver (in category &#39;bytecode generation&#39;) -----<br>
+ genReturnReceiver<br>
+       &quot;88-91          010110 ii                       Return Receiver/true/false/nil&quot;<br>
+       stream nextPut: 88!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genReturnSpecialLiteral: (in category &#39;bytecode generation&#39;) -----<br>
+ genReturnSpecialLiteral: aLiteral<br>
+       &quot;88-91          010110 ii                       Return Receiver/true/false/nil&quot;<br>
+       | index |<br>
+       index := #(true false nil) indexOf: aLiteral ifAbsent: 0.<br>
+       index = 0 ifTrue:<br>
+               [^self error: &#39;return special literal: &#39;, aLiteral printString,  &#39; is not one of true false nil&#39;].<br>
+       stream nextPut: 88 + index!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genReturnTop (in category &#39;bytecode generation&#39;) -----<br>
+ genReturnTop<br>
+       &quot;92             1011100         Return Stack Top From Message&quot;<br>
+       stream nextPut: 92!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genReturnTopToCaller (in category &#39;bytecode generation&#39;) -----<br>
+ genReturnTopToCaller<br>
+       &quot;93             1011101         Return Stack Top From Block [* return from enclosing block N, ExtA]&quot;<br>
+       &quot;If extended, the least significant bit of the extension determines if we return to the caller or not<br>
+        and the most significant bits determine how many levels of the static chain to return from.<br>
+               ExtA = iiiiiiij<br>
+               iiiiiii=0,j=0   =&gt;      return to caller<br>
+               iiiiiii=0,j=1   =&gt;      illegal<br>
+               iiiiiii=1,j=0   =&gt;      return to outerContext<br>
+               iiiiiii=1,j=1   =&gt;      return to outerContext sender/return from outerContext<br>
+               iiiiiii=2,j=0   =&gt;      return to outerContext outerContext<br>
+               iiiiiii=2,j=1   =&gt;      return to outerContext outerContext sender/return from outerContext outerContext<br>
+               etc&quot;<br>
+<br>
+       stream nextPut: 93!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genSend:numArgs: (in category &#39;bytecode generation&#39;) -----<br>
+ genSend: selectorLiteralIndex numArgs: nArgs<br>
+       | extendedIndex extendedNArgs |<br>
+       (selectorLiteralIndex &lt; 0 or: [selectorLiteralIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;selectorLiteralIndex&#39; index: selectorLiteralIndex range: 0 to: 65535].<br>
+       (nArgs &lt; 0 or: [nArgs &gt; 31]) ifTrue:<br>
+               [^self outOfRangeError: &#39;numArgs&#39; index: nArgs range: 0 to: 31 &quot;!!!!&quot;].<br>
+       (selectorLiteralIndex &lt; 16 and: [nArgs &lt; 3]) ifTrue:<br>
+               [&quot;128-143       1000 iiii                       Send Literal Selector #iiii With 0 Argument<br>
+                 144-159       1001 iiii                       Send Literal Selector #iiii With 1 Arguments<br>
+                 160-175       1010 iiii                       Send Literal Selector #iiii With 2 Arguments&quot;<br>
+                stream nextPut: 128 + (nArgs * 16) + selectorLiteralIndex.<br>
+                ^self].<br>
+       (extendedIndex := selectorLiteralIndex) &gt; 31 ifTrue:<br>
+               [self genUnsignedSingleExtendA: extendedIndex // 32.<br>
+                extendedIndex := extendedIndex \\ 32].<br>
+       (extendedNArgs := nArgs) &gt; 7 ifTrue:<br>
+               [self genUnsignedSingleExtendB: extendedNArgs // 8.<br>
+                extendedNArgs := extendedNArgs \\ 8].<br>
+       &quot;234            11101010        i i i i i j j j Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments&quot;<br>
+       stream<br>
+               nextPut: 238;<br>
+               nextPut: extendedNArgs + (extendedIndex * 8)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genSendSpecial:numArgs: (in category &#39;bytecode generation&#39;) -----<br>
+ genSendSpecial: specialSelectorIndex numArgs: nArgs<br>
+       self assert: (specialSelectorIndex between: 1 and: Smalltalk specialSelectorSize).<br>
+       self assert: nArgs = (Smalltalk specialNargsAt: specialSelectorIndex).<br>
+       &quot;Special selector sends.<br>
+               96-111          0110 iiii                       Send Arithmetic Message #iiii #(#+ #- #&lt; #&gt; #&#39;&lt;=&#39; #&#39;&gt;=&#39; #= #&#39;~=&#39; #* #/ #&#39;\\&#39; #@ #bitShift: #&#39;//&#39; #bitAnd: #bitOr:)<br>


+               112-119 01110 iii                       Send Special Message #iii #(#at: #at:put: #size ? ? ? #&#39;==&#39; class ? value value: ? ? ? ? ?)&quot;<br>
+<br>
+       stream nextPut: specialSelectorIndex + 95!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genSendSuper:numArgs: (in category &#39;bytecode generation&#39;) -----<br>
+ genSendSuper: selectorLiteralIndex numArgs: nArgs<br>
+       | extendedIndex extendedNArgs |<br>
+       (selectorLiteralIndex &lt; 0 or: [selectorLiteralIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;selectorLiteralIndex&#39; index: selectorLiteralIndex range: 0 to: 65535].<br>
+       (nArgs &lt; 0 or: [nArgs &gt; 31]) ifTrue:<br>
+               [^self outOfRangeError: &#39;numArgs&#39; index: nArgs range: 0 to: 31 &quot;!!!!&quot;].<br>
+       (extendedIndex := selectorLiteralIndex) &gt; 31 ifTrue:<br>
+               [self genUnsignedSingleExtendA: extendedIndex // 32.<br>
+                extendedIndex := extendedIndex \\ 32].<br>
+       (extendedNArgs := nArgs) &gt; 7 ifTrue:<br>
+               [self genUnsignedSingleExtendB: extendedNArgs // 8.<br>
+                extendedNArgs := extendedNArgs \\ 8].<br>
+       &quot;235            11101011        iiiiijjj                Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments&quot;<br>
+       stream<br>
+               nextPut: 235;<br>
+               nextPut: extendedNArgs + (extendedIndex * 8)!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genSignedSingleExtendB: (in category &#39;bytecode generation&#39;) -----<br>
+ genSignedSingleExtendB: extendedIndex<br>
+       (extendedIndex between: -128 and: 127) ifFalse:<br>
+               [^self outOfRangeError: &#39;index&#39; index: extendedIndex range: -128 to: 127].<br>
+       &quot;225            11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)&quot;<br>
+       stream<br>
+               nextPut: 225;<br>
+               nextPut: (extendedIndex &gt;= 0 ifTrue: [extendedIndex] ifFalse: [extendedIndex + 256]) !<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStoreInstVar: (in category &#39;bytecode generation&#39;) -----<br>
+ genStoreInstVar: instVarIndex<br>
+       &quot;243            11110011        iiiiiiii                Store Receiver Variable #iiiiiii (+ Extend A * 256)&quot;<br>
+       self genStoreInstVarLong: instVarIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStoreInstVarLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genStoreInstVarLong: instVarIndex<br>
+       &quot;243            11110011        iiiiiiii                Store Receiver Variable #iiiiiii (+ Extend A * 256)&quot;<br>
+       (instVarIndex &lt; 0 or: [instVarIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: instVarIndex range: 0 to: 65535].<br>
+       instVarIndex &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: instVarIndex // 256].<br>
+       stream<br>
+               nextPut: 243;<br>
+               nextPut: instVarIndex \\ 256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStoreLiteralVar: (in category &#39;bytecode generation&#39;) -----<br>
+ genStoreLiteralVar: literalIndex<br>
+       &quot;244            11110100        iiiiiiii                Store Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       (literalIndex &lt; 0 or: [literalIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: literalIndex range: 0 to: 65535].<br>
+       literalIndex &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: literalIndex // 256].<br>
+       stream<br>
+               nextPut: 244;<br>
+               nextPut: literalIndex \\ 256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStorePopInstVar: (in category &#39;bytecode generation&#39;) -----<br>
+ genStorePopInstVar: instVarIndex<br>
+       &quot;200-207        11001 iii                       Pop and Store Receiver Variable #iii<br>
+        240            11110000        iiiiiiii        Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)&quot;<br>
+       (instVarIndex &lt; 0 or: [instVarIndex &gt; 7]) ifTrue:<br>
+               [^self genStorePopInstVarLong: instVarIndex].<br>
+       stream nextPut: 200 + instVarIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStorePopInstVarLong: (in category &#39;bytecode generation&#39;) -----<br>
+ genStorePopInstVarLong: instVarIndex<br>
+       &quot;240            11110000        iiiiiiii                Pop and Store Receiver Variable #iiiiiii (+ Extend A * 256)&quot;<br>
+       (instVarIndex &lt; 0 or: [instVarIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: instVarIndex range: 0 to: 65535].<br>
+       instVarIndex &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: instVarIndex // 256].<br>
+       stream<br>
+               nextPut: 240;<br>
+               nextPut: instVarIndex \\ 256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStorePopLiteralVar: (in category &#39;bytecode generation&#39;) -----<br>
+ genStorePopLiteralVar: literalIndex<br>
+       &quot;241            11110001        iiiiiiii                Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)&quot;<br>
+       (literalIndex &lt; 0 or: [literalIndex &gt; 65535]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: literalIndex range: 0 to: 65535].<br>
+       literalIndex &gt; 255 ifTrue:<br>
+               [self genUnsignedSingleExtendA: literalIndex // 256].<br>
+       stream<br>
+               nextPut: 241;<br>
+               nextPut: literalIndex \\ 256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStorePopRemoteTemp:inVectorAt: (in category &#39;bytecode generation&#39;) -----<br>
+ genStorePopRemoteTemp: tempIndex inVectorAt: tempVectorIndex<br>
+       &quot;253            11111101        kkkkkkkk        jjjjjjjj                Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+       (tempIndex &lt; 0 or: [tempIndex &gt;= 256]) ifTrue:<br>
+               [^self outOfRangeError: &#39;remoteTempIndex&#39; index: tempIndex range: 0 to: 255].<br>
+       (tempVectorIndex &lt; 0 or: [tempVectorIndex &gt;= 256]) ifTrue:<br>
+               [^self outOfRangeError: &#39;tempVectorIndex&#39; index: tempVectorIndex range: 0 to: 255].<br>
+       stream<br>
+               nextPut: 253;<br>
+               nextPut: tempIndex;<br>
+               nextPut: tempVectorIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStorePopTemp: (in category &#39;bytecode generation&#39;) -----<br>
+ genStorePopTemp: tempIndex<br>
+       &quot;208-215        11010 iii                       Pop and Store Temporary Variable #iii<br>
+        242            11110010        iiiiiiii        Pop and Store Temporary Variable #iiiiiiii&quot;<br>
+       (tempIndex &lt; 0 or: [tempIndex &gt; 63]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: tempIndex range: 0 to: 63].<br>
+       tempIndex &lt; 8 ifTrue:<br>
+               [stream nextPut: 208 + tempIndex.<br>
+                ^self].<br>
+       stream<br>
+               nextPut: 242;<br>
+               nextPut: tempIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStoreRemoteTemp:inVectorAt: (in category &#39;bytecode generation&#39;) -----<br>
+ genStoreRemoteTemp: tempIndex inVectorAt: tempVectorIndex<br>
+       &quot;252            11111100        kkkkkkkk        jjjjjjjj                Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj&quot;<br>
+       (tempIndex &lt; 0 or: [tempIndex &gt;= 256]) ifTrue:<br>
+               [^self outOfRangeError: &#39;remoteTempIndex&#39; index: tempIndex range: 0 to: 255].<br>
+       (tempVectorIndex &lt; 0 or: [tempVectorIndex &gt;= 256]) ifTrue:<br>
+               [^self outOfRangeError: &#39;tempVectorIndex&#39; index: tempVectorIndex range: 0 to: 255].<br>
+       stream<br>
+               nextPut: 252;<br>
+               nextPut: tempIndex;<br>
+               nextPut: tempVectorIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genStoreTemp: (in category &#39;bytecode generation&#39;) -----<br>
+ genStoreTemp: tempIndex<br>
+       &quot;242            11110010        iiiiiiii                Pop and Store Temporary Variable #iiiiiiii&quot;<br>
+       (tempIndex &lt; 0 or: [tempIndex &gt; 63]) ifTrue:<br>
+               [^self outOfRangeError: &#39;index&#39; index: tempIndex range: 0 to: 63].<br>
+       stream<br>
+               nextPut: 242;<br>
+               nextPut: tempIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genUnsignedMultipleExtendA: (in category &#39;bytecode generation&#39;) -----<br>
+ genUnsignedMultipleExtendA: extendedIndex<br>
+       &quot;224            11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)&quot;<br>
+       extendedIndex &gt; 255 ifTrue:<br>
+               [self genUnsignedMultipleExtendA: extendedIndex // 256].<br>
+       stream<br>
+               nextPut: 224;<br>
+               nextPut: extendedIndex \\ 256!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genUnsignedSingleExtendA: (in category &#39;bytecode generation&#39;) -----<br>
+ genUnsignedSingleExtendA: extendedIndex<br>
+       (extendedIndex between: 0 and: 255) ifFalse:<br>
+               [^self outOfRangeError: &#39;index&#39; index: extendedIndex range: 0 to: 255].<br>
+       &quot;224            11100000        aaaaaaaa        Extend A (Ext A = Ext A prev * 256 + Ext A)&quot;<br>
+       stream<br>
+               nextPut: 224;<br>
+               nextPut: extendedIndex!<br>
<br>
Item was added:<br>
+ ----- Method: EncoderForSistaV1&gt;&gt;genUnsignedSingleExtendB: (in category &#39;bytecode generation&#39;) -----<br>
+ genUnsignedSingleExtendB: extendedIndex<br>
+       (extendedIndex between: 0 and: 255) ifFalse:<br>
+               [^self outOfRangeError: &#39;index&#39; index: extendedIndex range: 0 to: 255].<br>
+       &quot;225            11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)&quot;<br>
+       stream<br>
+               nextPut: 225;<br>
+               nextPut: extendedIndex!<br>
<br>
Item was added:<br>
+ ----- Method: InstructionClient&gt;&gt;pushExplicitOuter: (in category &#39;*BytecodeSets-NewsqueakV3-instruction decoding&#39;) -----<br>
+ pushExplicitOuter: n<br>
+       &quot;Push the Active Context&#39;s Receiver for an outer send at level n.&quot;<br>
+<br>
+       self subclassResponsibility!<br>
<br>
Item was changed:<br>
  ----- Method: InstructionPrinter&gt;&gt;pushExplicitOuter: (in category &#39;*BytecodeSets-NewsqueakV3-instruction decoding&#39;) -----<br>
  pushExplicitOuter: n<br>
+       &quot;Print the Push the Active Context&#39;s Receiver for an outer send at level (method literalAt: litIndex) bytecode.&quot;<br>
-       &quot;Print the Push Active Context&#39;s Receiver for an outer send of aSymbol on Top Of Stack bytecode.&quot;<br>
<br>
        self print: &#39;pushExplicitOuter: &#39;, n asString!<br>
<br>
Item was added:<br>
+ ----- Method: InstructionStream&gt;&gt;interpretNSV4Jump (in category &#39;*BytecodeSets-NewsqueakV4-decoding&#39;) -----<br>
+ interpretNSV4Jump<br>
+       &quot;If the instruction at pc is an unconditional jump, interpret it, advancing the pc,<br>
+        and answering the jump distance. Otherwise answer nil.&quot;<br>
+<br>
+       &quot;       192-199 11000 i i i                             Jump iii + 1 (i.e., 1 through 8)<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        *      242             11110010        i i i i i i i i Jump i i i i i i i i (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)&quot;<br>
+       | method byte nextpc extA extB |<br>
+       method := self method.<br>
+       &quot;consume and compute any extensions first.&quot;<br>
+       extA := extB := 0.<br>
+       nextpc := pc. &quot;must not advance pc unless this is a jump.&quot;<br>
+       [byte := self method at: nextpc.<br>
+        nextpc := nextpc + 1.<br>
+        byte &gt;= 224 and: [byte &lt;= 225]] whileTrue:<br>
+               [| extByte |<br>
+                extByte := self method at: nextpc.<br>
+                nextpc := nextpc + 1.<br>
+                byte = 224<br>
+                       ifTrue:<br>
+                               [extA := (extA bitShift: 8) + extByte]<br>
+                       ifFalse:<br>
+                               [extB := (extB = 0 and: [extByte &gt; 127])<br>
+                                                       ifTrue: [extByte - 256]<br>
+                                                       ifFalse: [(extB bitShift: 8) + extByte]]].<br>
+       (byte between: 192 and: 199) ifTrue:<br>
+               [pc := nextpc.<br>
+                ^byte - 191].<br>
+       byte = 242 ifTrue:<br>
+               [byte := method at: nextpc.<br>
+                pc := nextpc + 1.<br>
+                ^(extB bitShift: 8) + byte].<br>
+       ^nil!<br>
<br>
Item was added:<br>
+ ----- Method: InstructionStream&gt;&gt;interpretNSV4JumpIfCond (in category &#39;*BytecodeSets-NewsqueakV4-decoding&#39;) -----<br>
+ interpretNSV4JumpIfCond<br>
+       &quot;If the instruction at pc is a conditional jump, interpret it, advancing the pc,<br>
+        and answering the jump distance. Otherwise answer nil.&quot;<br>
+<br>
+       &quot;       200-207 11001 i i i                             Pop and Jump 0n True iii +1 (i.e., 1 through 8)<br>
+               208-215 11010 i i i                             Pop and Jump 0n False iii +1 (i.e., 1 through 8)<br>
+        *      225             11100001        sbbbbbbb        Extend B (Ext B = Ext B prev * 256 + Ext B)<br>
+        *      243             11110011        i i i i i i i i Pop and Jump 0n True i i i i i i i i (+ Extend B * 256, where Extend B &gt;= 0)<br>
+        *      244             11110100        i i i i i i i i Pop and Jump 0n False i i i i i i i i (+ Extend B * 256, where Extend B &gt;= 0)&quot;<br>
+       | method byte nextpc extA extB |<br>
+       method := self method.<br>
+       &quot;consume and compute any extensions first.&quot;<br>
+       extA := extB := 0.<br>
+       nextpc := pc. &quot;must not advance pc unless this is a jump.&quot;<br>
+       [byte := self method at: nextpc.<br>
+        nextpc := nextpc + 1.<br>
+        byte &gt;= 224 and: [byte &lt;= 225]] whileTrue:<br>
+               [| extByte |<br>
+                extByte := self method at: nextpc.<br>
+                nextpc := nextpc + 1.<br>
+                byte = 224<br>
+                       ifTrue:<br>
+                               [extA := (extA bitShift: 8) + extByte]<br>
+                       ifFalse:<br>
+                               [extB := (extB = 0 and: [extByte &gt; 127])<br>
+                                                       ifTrue: [extByte - 256]<br>
+                                                       ifFalse: [(extB bitShift: 8) + extByte]]].<br>
+       (byte between: 200 and: 215) ifTrue:<br>
+               [pc := nextpc.<br>
+                ^(byte bitAnd: 7) + 1].<br>
+       (byte between: 243 and: 244) ifTrue:<br>
+               [byte := method at: nextpc.<br>
+                pc := nextpc + 1.<br>
+                ^(extB bitShift: 8) + byte].<br>
+       ^nil!<br>
<br>
</blockquote></div><br></div>