<p dir="ltr">I don&#39;t think ARM or MIPS have an instruction that preserves the high bits in the destination register. How about using movzxb on ia32/x64?</p>
<div class="gmail_quote">On Nov 3, 2015 3:10 AM, &quot;Eliot Miranda&quot; &lt;<a href="mailto:eliot.miranda@gmail.com">eliot.miranda@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br><div dir="auto"><div>Hi Ryan,</div><div><br>On Nov 2, 2015, at 8:51 PM, Ryan Macnak &lt;<a href="mailto:rmacnak@gmail.com" target="_blank">rmacnak@gmail.com</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><span></span></div></blockquote><blockquote type="cite"><div><div dir="ltr">Does MoveAbR want zero extension or sign extension?</div></div></blockquote><div><br></div>If there is extension it must be zero extension.  I *think* that on x86 assignment to %al, %bl et al on x86 leaves all other bits in the corresponding 32-bit register unchanged, so I stated in the comment for MoveMb:r:R: that if the code generator wants the higher bits zero it will explicitly zero the register before the byte load. I&#39;ll make the comment for MoveAb:R: explicit.  To save the instruction I could add a backEnd query, eg backEnd byteLoadsZeroExtend.<span style="background-color:rgba(255,255,255,0)"><br><br>_,,,^..^,,,_ (phone)</span><div><br><blockquote type="cite"><div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 2, 2015 at 6:17 PM,  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</span> wrote:<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 VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1504.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1504.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-eem.1504<br>
Author: eem<br>
Time: 2 November 2015, 10:16:22.592 pm<br>
UUID: 3c702143-ff40-4e38-a55e-065a3aec15ec<br>
Ancestors: VMMaker.oscog-EstebanLorenzano.1503<br>
<br>
Merge with VMMaker.oscog-EstebanLorenzano.1503:<br>
- simplify the addressIsInInstructions: macro.<br>
- express some concerns about ffiAddressOf:startingAt:size:<br>
<br>
x64 Cogit:<br>
Add support for MoveAb:R: &amp; MoveR:Ab: on x64 &amp; x86.  Tim, would you mind adding support for ARM?<br>
The misuse of MoveMb:r:R:/MoveR:Mb:r: as a stand-in for MoveAb:R:/MoveR:Ab: only works on 32-bit platforms.<br>
<br>
Fix rip-relative addressing for MoveCwR/PushCw.  Add some tests.<br>
<br>
Nuke the leaking breaks in genInnerPrimitiveNew[WithArg]:<br>
<br>
Execution now gets to the first jitted method that wants to create a closure.<br>
<br>
=============== Diff against VMMaker.oscog-EstebanLorenzano.1503 ===============<br>
<br>
Item was changed:<br>
  ----- Method: CogIA32Compiler&gt;&gt;computeMaximumSize (in category &#39;generate machine code&#39;) -----<br>
  computeMaximumSize<br>
        &quot;Compute the maximum size for each opcode.  This allows jump offsets to<br>
         be determined, provided that all backward branches are long branches.&quot;<br>
        &quot;N.B.  The ^N forms are to get around the bytecode compiler&#39;s long branch<br>
         limits which are exceeded when each case jumps around the otherwise.&quot;<br>
        opcode caseOf: {<br>
                &quot;Noops &amp; Pseudo Ops&quot;<br>
                [Label]                                 -&gt; [^0].<br>
                [AlignmentNops]         -&gt; [^(operands at: 0) - 1].<br>
                [Fill16]                                        -&gt; [^2].<br>
                [Fill32]                                        -&gt; [^4].<br>
                [FillFromWord]                  -&gt; [^4].<br>
                [Nop]                                   -&gt; [^1].<br>
                &quot;Specific Control/Data Movement&quot;<br>
                [CDQ]                                   -&gt; [^1].<br>
                [IDIVR]                                 -&gt; [^2].<br>
                [IMULRR]                                -&gt; [^3].<br>
                [CPUID]                                 -&gt; [^2].<br>
                [CMPXCHGAwR]                    -&gt; [^7].<br>
                [CMPXCHGMwrR]           -&gt; [^(self concreteRegister: (operands at: 1)) = ESP<br>
                                                                                ifTrue: [(self isQuick: (operands at: 0)) ifTrue: [5] ifFalse: [8]]<br>
                                                                                ifFalse: [(self isQuick: (operands at: 0)) ifTrue: [4] ifFalse: [7]]].<br>
                [LFENCE]                                -&gt; [^3].<br>
                [MFENCE]                                -&gt; [^3].<br>
                [SFENCE]                                -&gt; [^3].<br>
                [LOCK]                                  -&gt; [^1].<br>
                [XCHGAwR]                               -&gt; [^6].<br>
                [XCHGMwrR]                      -&gt; [^(self concreteRegister: (operands at: 1)) = ESP<br>
                                                                                ifTrue: [(self isQuick: (operands at: 0)) ifTrue: [4] ifFalse: [7]]<br>
                                                                                ifFalse: [(self isQuick: (operands at: 0)) ifTrue: [3] ifFalse: [6]]].<br>
                [XCHGRR]                                -&gt; [^((self concreteRegister: (operands at: 0)) = EAX<br>
                                                                           or: [(self concreteRegister: (operands at: 1)) = EAX])<br>
                                                                                ifTrue: [1]<br>
                                                                                ifFalse: [2]].<br>
                &quot;Control&quot;<br>
                [CallFull]                                      -&gt; [^5].<br>
                [Call]                                          -&gt; [^5].<br>
                [JumpR]                                         -&gt; [^2].<br>
                [JumpFull]                                      -&gt; [self resolveJumpTarget. ^5].<br>
                [JumpLong]                                      -&gt; [self resolveJumpTarget. ^5].<br>
                [Jump]                                          -&gt; [self resolveJumpTarget. ^5].<br>
                [JumpZero]                                      -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpNonZero]                           -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpNegative]                          -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpNonNegative]                       -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpOverflow]                          -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpNoOverflow]                        -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpCarry]                             -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpNoCarry]                           -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpLess]                                      -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpGreaterOrEqual]            -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpGreater]                           -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpLessOrEqual]                       -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpBelow]                             -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpAboveOrEqual]              -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpAbove]                             -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpBelowOrEqual]              -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpLongZero]                  -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpLongNonZero]               -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPEqual]                           -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPNotEqual]                        -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPLess]                            -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPGreaterOrEqual]  -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPGreater]                 -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPLessOrEqual]             -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPOrdered]                 -&gt; [self resolveJumpTarget. ^6].<br>
                [JumpFPUnordered]                       -&gt; [self resolveJumpTarget. ^6].<br>
                [RetN]                                          -&gt; [^(operands at: 0) = 0 ifTrue: [1] ifFalse: [3]].<br>
                [Stop]                                          -&gt; [^1].<br>
<br>
                &quot;Arithmetic&quot;<br>
                [AddCqR]                -&gt; [^(self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [(self concreteRegister: (operands at: 1)) = EAX<br>
                                                                                                                ifTrue: [5]<br>
                                                                                                                ifFalse: [6]]].<br>
                [AndCqR]                -&gt; [^(self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [(self concreteRegister: (operands at: 1)) = EAX<br>
                                                                                                                ifTrue: [5]<br>
                                                                                                                ifFalse: [6]]].<br>
                [CmpCqR]                -&gt; [^(self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [(self concreteRegister: (operands at: 1)) = EAX<br>
                                                                                                                ifTrue: [5]<br>
                                                                                                                ifFalse: [6]]].<br>
                [OrCqR]                 -&gt; [^(self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [(self concreteRegister: (operands at: 1)) = EAX<br>
                                                                                                                ifTrue: [5]<br>
                                                                                                                ifFalse: [6]]].<br>
                [SubCqR]                -&gt; [^(self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [(self concreteRegister: (operands at: 1)) = EAX<br>
                                                                                                                ifTrue: [5]<br>
                                                                                                                ifFalse: [6]]].<br>
                [TstCqR]                -&gt; [^((self isQuick: (operands at: 0)) and: [(self concreteRegister: (operands at: 1)) &lt; 4])<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [(self concreteRegister: (operands at: 1)) = EAX<br>
                                                                                                                ifTrue: [5]<br>
                                                                                                                ifFalse: [6]]].<br>
                [AddCwR]                -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [AndCwR]                -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [CmpCwR]                -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [OrCwR]         -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [SubCwR]                -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [XorCwR]                -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [AddRR]                 -&gt; [^2].<br>
                [AndRR]                 -&gt; [^2].<br>
                [CmpRR]         -&gt; [^2].<br>
                [OrRR]                  -&gt; [^2].<br>
                [XorRR]                 -&gt; [^2].<br>
                [SubRR]                 -&gt; [^2].<br>
                [NegateR]               -&gt; [^2].<br>
                [LoadEffectiveAddressMwrR]<br>
                                                -&gt; [^((self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [3]<br>
                                                                                        ifFalse: [6])<br>
                                                                                + ((self concreteRegister: (operands at: 1)) = ESP<br>
                                                                                        ifTrue: [1]<br>
                                                                                        ifFalse: [0])].<br>
                [LogicalShiftLeftCqR]           -&gt; [^(operands at: 0) = 1 ifTrue: [2] ifFalse: [3]].<br>
                [LogicalShiftRightCqR]          -&gt; [^(operands at: 0) = 1 ifTrue: [2] ifFalse: [3]].<br>
                [ArithmeticShiftRightCqR]       -&gt; [^(operands at: 0) = 1 ifTrue: [2] ifFalse: [3]].<br>
                [LogicalShiftLeftRR]                    -&gt; [^self computeShiftRRSize].<br>
                [LogicalShiftRightRR]           -&gt; [^self computeShiftRRSize].<br>
                [ArithmeticShiftRightRR]                -&gt; [^self computeShiftRRSize].<br>
                [AddRdRd]                                       -&gt; [^4].<br>
                [CmpRdRd]                                       -&gt; [^4].<br>
                [SubRdRd]                                       -&gt; [^4].<br>
                [MulRdRd]                                       -&gt; [^4].<br>
                [DivRdRd]                                       -&gt; [^4].<br>
                [SqrtRd]                                        -&gt; [^4].<br>
                &quot;Data Movement&quot;<br>
                [MoveCqR]               -&gt; [^(operands at: 0) = 0 ifTrue: [2] ifFalse: [5]].<br>
                [MoveCwR]               -&gt; [^5].<br>
                [MoveRR]                -&gt; [^2].<br>
                [MoveRdRd]              -&gt; [^4].<br>
                [MoveAwR]               -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [MoveRAw]               -&gt; [^(self concreteRegister: (operands at: 0)) = EAX ifTrue: [5] ifFalse: [6]].<br>
+               [MoveAbR]               -&gt; [^(self concreteRegister: (operands at: 1)) = EAX ifTrue: [5] ifFalse: [6]].<br>
+               [MoveRAb]               -&gt; [^(self concreteRegister: (operands at: 0)) = EAX ifTrue: [5] ifFalse: [6]].<br>
                [MoveRMwr]      -&gt; [^((self isQuick: (operands at: 1))<br>
                                                                        ifTrue: [((operands at: 1) = 0<br>
                                                                                        and: [(self concreteRegister: (operands at: 2)) ~= EBP])<br>
                                                                                                ifTrue: [2]<br>
                                                                                                ifFalse: [3]]<br>
                                                                        ifFalse: [6])<br>
                                                                + ((self concreteRegister: (operands at: 2)) = ESP<br>
                                                                        ifTrue: [1]<br>
                                                                        ifFalse: [0])].<br>
                [MoveRdM64r]    -&gt; [^((self isQuick: (operands at: 1))<br>
                                                                                        ifTrue: [5]<br>
                                                                                        ifFalse: [8])<br>
                                                                                + ((self concreteRegister: (operands at: 2)) = ESP<br>
                                                                                        ifTrue: [1]<br>
                                                                                        ifFalse: [0])].<br>
                [MoveMbrR]              -&gt; [^(self concreteRegister: (operands at: 1)) = ESP<br>
                                                                ifTrue: [(self isQuick: (operands at: 0)) ifTrue: [5] ifFalse: [8]]<br>
                                                                ifFalse: [(self isQuick: (operands at: 0)) ifTrue: [4] ifFalse: [7]]].<br>
                [MoveRMbr]              -&gt; [^(self concreteRegister: (operands at: 2)) = ESP<br>
                                                                ifTrue: [7]<br>
                                                                ifFalse: [(self isQuick: (operands at: 1)) ifTrue: [3] ifFalse: [6]]].<br>
                [MoveM16rR]     -&gt; [^(self concreteRegister: (operands at: 1)) = ESP<br>
                                                                ifTrue: [(self isQuick: (operands at: 0)) ifTrue: [5] ifFalse: [8]]<br>
                                                                ifFalse: [(self isQuick: (operands at: 0)) ifTrue: [4] ifFalse: [7]]].<br>
                [MoveM64rRd]    -&gt; [^((self isQuick: (operands at: 0))<br>
                                                                                        ifTrue: [5]<br>
                                                                                        ifFalse: [8])<br>
                                                                                + ((self concreteRegister: (operands at: 1)) = ESP<br>
                                                                                        ifTrue: [1]<br>
                                                                                        ifFalse: [0])].<br>
                [MoveMwrR]              -&gt; [^((self isQuick: (operands at: 0))<br>
                                                                        ifTrue: [((operands at: 0) = 0<br>
                                                                                        and: [(self concreteRegister: (operands at: 1)) ~= EBP])<br>
                                                                                                ifTrue: [2]<br>
                                                                                                ifFalse: [3]]<br>
                                                                        ifFalse: [6])<br>
                                                                + ((self concreteRegister: (operands at: 1)) = ESP<br>
                                                                        ifTrue: [1]<br>
                                                                        ifFalse: [0])].<br>
                [MoveXbrRR]     -&gt; [self assert: (self concreteRegister: (operands at: 0)) ~= ESP.<br>
                                                        ^(self concreteRegister: (operands at: 1)) = EBP<br>
                                                                                        ifTrue: [5]<br>
                                                                                        ifFalse: [4]].<br>
                [MoveRXbrR]     -&gt;      [self assert: (self concreteRegister: (operands at: 1)) ~= ESP.<br>
                                                        ^((self concreteRegister: (operands at: 2)) = EBP<br>
                                                                                        ifTrue: [4]<br>
                                                                                        ifFalse: [3])<br>
                                                                                + ((self concreteRegister: (operands at: 0)) &gt;= 4<br>
                                                                                        ifTrue: [2]<br>
                                                                                        ifFalse: [0])].<br>
                [MoveXwrRR]     -&gt; [self assert: (self concreteRegister: (operands at: 0)) ~= ESP.<br>
                                                        ^(self concreteRegister: (operands at: 1)) = EBP<br>
                                                                                        ifTrue: [4]<br>
                                                                                        ifFalse: [3]].<br>
                [MoveRXwrR]     -&gt; [self assert: (self concreteRegister: (operands at: 1)) ~= ESP.<br>
                                                        ^(self concreteRegister: (operands at: 2)) = EBP<br>
                                                                                        ifTrue: [4]<br>
                                                                                        ifFalse: [3]].<br>
                [PopR]                  -&gt; [^1].<br>
                [PushR]                 -&gt; [^1].<br>
                [PushCq]                -&gt; [^(self isQuick: (operands at: 0)) ifTrue: [2] ifFalse: [5]].<br>
                [PushCw]                -&gt; [^5].<br>
                [PrefetchAw]    -&gt; [^self hasSSEInstructions ifTrue: [7] ifFalse: [0]].<br>
                &quot;Conversion&quot;<br>
                [ConvertRRd]    -&gt; [^4] }.<br>
        ^0 &quot;to keep C compiler quiet&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: CogIA32Compiler&gt;&gt;concretizeMoveAbR (in category &#39;generate machine code&#39;) -----<br>
+ concretizeMoveAbR<br>
+       &quot;Will get inlined into concretizeAt: switch.&quot;<br>
+       &lt;inline: true&gt;<br>
+       | addressOperand reg |<br>
+       addressOperand := operands at: 0.<br>
+       (self isAnInstruction: (cogit cCoerceSimple: addressOperand to: #&#39;AbstractInstruction *&#39;)) ifTrue:<br>
+               [addressOperand := (cogit cCoerceSimple: addressOperand to: #&#39;AbstractInstruction *&#39;) address].<br>
+       reg := self concreteRegister: (operands at: 1).<br>
+       reg = EAX ifTrue:<br>
+               [machineCode<br>
+                       at: 0 put: 16rA0;<br>
+                       at: 1 put: (addressOperand bitAnd: 16rFF);<br>
+                       at: 2 put: (addressOperand &gt;&gt; 8 bitAnd: 16rFF);<br>
+                       at: 3 put: (addressOperand &gt;&gt; 16 bitAnd: 16rFF);<br>
+                       at: 4 put: (addressOperand &gt;&gt; 24 bitAnd: 16rFF).<br>
+                       ^machineCodeSize := 5].<br>
+       machineCode<br>
+               at: 0 put: 16r8A;<br>
+               at: 1 put: (self mod: ModRegInd RM: 5 RO: reg);<br>
+               at: 2 put: (addressOperand bitAnd: 16rFF);<br>
+               at: 3 put: (addressOperand &gt;&gt; 8 bitAnd: 16rFF);<br>
+               at: 4 put: (addressOperand &gt;&gt; 16 bitAnd: 16rFF);<br>
+               at: 5 put: (addressOperand &gt;&gt; 24 bitAnd: 16rFF).<br>
+       ^machineCodeSize := 6!<br>
<br>
Item was added:<br>
+ ----- Method: CogIA32Compiler&gt;&gt;concretizeMoveRAb (in category &#39;generate machine code&#39;) -----<br>
+ concretizeMoveRAb<br>
+       &quot;Will get inlined into concretizeAt: switch.&quot;<br>
+       &lt;inline: true&gt;<br>
+       | addressOperand reg |<br>
+       reg := self concreteRegister: (operands at: 0).<br>
+       addressOperand := operands at: 1.<br>
+       (self isAnInstruction: (cogit cCoerceSimple: addressOperand to: #&#39;AbstractInstruction *&#39;)) ifTrue:<br>
+               [addressOperand := (cogit cCoerceSimple: addressOperand to: #&#39;AbstractInstruction *&#39;) address].<br>
+       reg = EAX ifTrue:<br>
+               [machineCode<br>
+                       at: 0 put: 16rA2;<br>
+                       at: 1 put: (addressOperand bitAnd: 16rFF);<br>
+                       at: 2 put: (addressOperand &gt;&gt; 8 bitAnd: 16rFF);<br>
+                       at: 3 put: (addressOperand &gt;&gt; 16 bitAnd: 16rFF);<br>
+                       at: 4 put: (addressOperand &gt;&gt; 24 bitAnd: 16rFF).<br>
+                       ^machineCodeSize := 5].<br>
+       machineCode<br>
+               at: 0 put: 16r88;<br>
+               at: 1 put: (self mod: ModRegInd RM: 5 RO: reg);<br>
+               at: 2 put: (addressOperand bitAnd: 16rFF);<br>
+               at: 3 put: (addressOperand &gt;&gt; 8 bitAnd: 16rFF);<br>
+               at: 4 put: (addressOperand &gt;&gt; 16 bitAnd: 16rFF);<br>
+               at: 5 put: (addressOperand &gt;&gt; 24 bitAnd: 16rFF).<br>
+       ^machineCodeSize := 6!<br>
<br>
Item was changed:<br>
  ----- Method: CogIA32Compiler&gt;&gt;dispatchConcretize (in category &#39;generate machine code&#39;) -----<br>
  dispatchConcretize<br>
        &quot;Attempt to generate concrete machine code for the instruction at address.<br>
         This is the inner dispatch of concretizeAt: actualAddress which exists only<br>
         to get around the branch size limits in the SqueakV3 (blue book derived)<br>
         bytecode set.&quot;<br>
        &lt;returnTypeC: #void&gt;<br>
        opcode caseOf: {<br>
                &quot;Noops &amp; Pseudo Ops&quot;<br>
                [Label]                         -&gt; [^self concretizeLabel].<br>
                [AlignmentNops] -&gt; [^self concretizeAlignmentNops].<br>
                [Fill16]                                -&gt; [^self concretizeFill16].<br>
                [Fill32]                                -&gt; [^self concretizeFill32].<br>
                [FillFromWord]          -&gt; [^self concretizeFillFromWord].<br>
                [Nop]                           -&gt; [^self concretizeNop].<br>
                &quot;Specific Control/Data Movement&quot;<br>
                [CDQ]                                   -&gt; [^self concretizeCDQ].<br>
                [IDIVR]                                 -&gt; [^self concretizeIDIVR].<br>
                [IMULRR]                                -&gt; [^self concretizeMulRR].<br>
                [CPUID]                                 -&gt; [^self concretizeCPUID].<br>
                [CMPXCHGAwR]                    -&gt; [^self concretizeCMPXCHGAwR].<br>
                [CMPXCHGMwrR]           -&gt; [^self concretizeCMPXCHGMwrR].<br>
                [LFENCE]                                -&gt; [^self concretizeFENCE: 5].<br>
                [MFENCE]                                -&gt; [^self concretizeFENCE: 6].<br>
                [SFENCE]                                -&gt; [^self concretizeFENCE: 7].<br>
                [LOCK]                                  -&gt; [^self concretizeLOCK].<br>
                [XCHGAwR]                               -&gt; [^self concretizeXCHGAwR].<br>
                [XCHGMwrR]                      -&gt; [^self concretizeXCHGMwrR].<br>
                [XCHGRR]                                -&gt; [^self concretizeXCHGRR].<br>
                &quot;Control&quot;<br>
                [Call]                                  -&gt; [^self concretizeCall].<br>
                [CallFull]                              -&gt; [^self concretizeCall].<br>
                [JumpR]                                 -&gt; [^self concretizeJumpR].<br>
                [JumpFull]                              -&gt; [^self concretizeJumpLong].<br>
                [JumpLong]                              -&gt; [^self concretizeJumpLong].<br>
                [JumpLongZero]          -&gt; [^self concretizeConditionalJump: 16r4].<br>
                [JumpLongNonZero]       -&gt; [^self concretizeConditionalJump: 16r5].<br>
                [Jump]                                  -&gt; [^self concretizeJump].<br>
                &quot;Table B-1 IntelŽ 64 and IA-32 Architectures Software Developer&#39;s Manual Volume 1: Basic Architecture&quot;<br>
                [JumpZero]                              -&gt; [^self concretizeConditionalJump: 16r4].<br>
                [JumpNonZero]                   -&gt; [^self concretizeConditionalJump: 16r5].<br>
                [JumpNegative]                  -&gt; [^self concretizeConditionalJump: 16r8].<br>
                [JumpNonNegative]               -&gt; [^self concretizeConditionalJump: 16r9].<br>
                [JumpOverflow]                  -&gt; [^self concretizeConditionalJump: 16r0].<br>
                [JumpNoOverflow]                -&gt; [^self concretizeConditionalJump: 16r1].<br>
                [JumpCarry]                     -&gt; [^self concretizeConditionalJump: 16r2].<br>
                [JumpNoCarry]                   -&gt; [^self concretizeConditionalJump: 16r3].<br>
                [JumpLess]                              -&gt; [^self concretizeConditionalJump: 16rC].<br>
                [JumpGreaterOrEqual]    -&gt; [^self concretizeConditionalJump: 16rD].<br>
                [JumpGreater]                   -&gt; [^self concretizeConditionalJump: 16rF].<br>
                [JumpLessOrEqual]               -&gt; [^self concretizeConditionalJump: 16rE].<br>
                [JumpBelow]                     -&gt; [^self concretizeConditionalJump: 16r2].<br>
                [JumpAboveOrEqual]      -&gt; [^self concretizeConditionalJump: 16r3].<br>
                [JumpAbove]                     -&gt; [^self concretizeConditionalJump: 16r7].<br>
                [JumpBelowOrEqual]      -&gt; [^self concretizeConditionalJump: 16r6].<br>
                [JumpFPEqual]                           -&gt; [^self concretizeConditionalJump: 16r4].<br>
                [JumpFPNotEqual]                        -&gt; [^self concretizeConditionalJump: 16r5].<br>
                [JumpFPLess]                            -&gt; [^self concretizeConditionalJump: 16r2].<br>
                [JumpFPGreaterOrEqual]  -&gt; [^self concretizeConditionalJump: 16r3].<br>
                [JumpFPGreater]                 -&gt; [^self concretizeConditionalJump: 16r7].<br>
                [JumpFPLessOrEqual]             -&gt; [^self concretizeConditionalJump: 16r6].<br>
                [JumpFPOrdered]                 -&gt; [^self concretizeConditionalJump: 16rB].<br>
                [JumpFPUnordered]                       -&gt; [^self concretizeConditionalJump: 16rA].<br>
                [RetN]                                          -&gt; [^self concretizeRetN].<br>
                [Stop]                                          -&gt; [^self concretizeStop].<br>
                &quot;Arithmetic&quot;<br>
                [AddCqR]                                        -&gt; [^self concretizeAddCqR].<br>
                [AddCwR]                                        -&gt; [^self concretizeAddCwR].<br>
                [AddRR]                                         -&gt; [^self concretizeAddRR].<br>
                [AddRdRd]                                       -&gt; [^self concretizeSEE2OpRdRd: 16r58].<br>
                [AndCqR]                                        -&gt; [^self concretizeAndCqR].<br>
                [AndCwR]                                        -&gt; [^self concretizeAndCwR].<br>
                [AndRR]                                         -&gt; [^self concretizeAndRR].<br>
                [TstCqR]                                        -&gt; [^self concretizeTstCqR].<br>
                [CmpCqR]                                        -&gt; [^self concretizeCmpCqR].<br>
                [CmpCwR]                                        -&gt; [^self concretizeCmpCwR].<br>
                [CmpRR]                                 -&gt; [^self concretizeCmpRR].<br>
                [CmpRdRd]                                       -&gt; [^self concretizeCmpRdRd].<br>
                [DivRdRd]                                       -&gt; [^self concretizeSEE2OpRdRd: 16r5E].<br>
                [MulRdRd]                                       -&gt; [^self concretizeSEE2OpRdRd: 16r59].<br>
                [OrCqR]                                         -&gt; [^self concretizeOrCqR].<br>
                [OrCwR]                                 -&gt; [^self concretizeOrCwR].<br>
                [OrRR]                                          -&gt; [^self concretizeOrRR].<br>
                [SubCqR]                                        -&gt; [^self concretizeSubCqR].<br>
                [SubCwR]                                        -&gt; [^self concretizeSubCwR].<br>
                [SubRR]                                         -&gt; [^self concretizeSubRR].<br>
                [SubRdRd]                                       -&gt; [^self concretizeSEE2OpRdRd: 16r5C].<br>
                [SqrtRd]                                                -&gt; [^self concretizeSqrtRd].<br>
                [XorCwR]                                                -&gt; [^self concretizeXorCwR].<br>
                [XorRR]                                                 -&gt; [^self concretizeXorRR].<br>
                [NegateR]                                               -&gt; [^self concretizeNegateR].<br>
                [LoadEffectiveAddressMwrR]      -&gt; [^self concretizeLoadEffectiveAddressMwrR].<br>
                [ArithmeticShiftRightCqR]               -&gt; [^self concretizeArithmeticShiftRightCqR].<br>
                [LogicalShiftRightCqR]                  -&gt; [^self concretizeLogicalShiftRightCqR].<br>
                [LogicalShiftLeftCqR]                   -&gt; [^self concretizeLogicalShiftLeftCqR].<br>
                [ArithmeticShiftRightRR]                        -&gt; [^self concretizeArithmeticShiftRightRR].<br>
                [LogicalShiftLeftRR]                            -&gt; [^self concretizeLogicalShiftLeftRR].<br>
                &quot;Data Movement&quot;<br>
                [MoveCqR]                       -&gt; [^self concretizeMoveCqR].<br>
                [MoveCwR]                       -&gt; [^self concretizeMoveCwR].<br>
                [MoveRR]                        -&gt; [^self concretizeMoveRR].<br>
                [MoveAwR]                       -&gt; [^self concretizeMoveAwR].<br>
                [MoveRAw]                       -&gt; [^self concretizeMoveRAw].<br>
+               [MoveAbR]                       -&gt; [^self concretizeMoveAbR].<br>
+               [MoveRAb]                       -&gt; [^self concretizeMoveRAb].<br>
                [MoveMbrR]                      -&gt; [^self concretizeMoveMbrR].<br>
                [MoveRMbr]                      -&gt; [^self concretizeMoveRMbr].<br>
                [MoveM16rR]             -&gt; [^self concretizeMoveM16rR].<br>
                [MoveM64rRd]            -&gt; [^self concretizeMoveM64rRd].<br>
                [MoveMwrR]              -&gt; [^self concretizeMoveMwrR].<br>
                [MoveXbrRR]             -&gt; [^self concretizeMoveXbrRR].<br>
                [MoveRXbrR]             -&gt; [^self concretizeMoveRXbrR].<br>
                [MoveXwrRR]             -&gt; [^self concretizeMoveXwrRR].<br>
                [MoveRXwrR]             -&gt; [^self concretizeMoveRXwrR].<br>
                [MoveRMwr]              -&gt; [^self concretizeMoveRMwr].<br>
                [MoveRdM64r]            -&gt; [^self concretizeMoveRdM64r].<br>
                [PopR]                          -&gt; [^self concretizePopR].<br>
                [PushR]                         -&gt; [^self concretizePushR].<br>
                [PushCq]                        -&gt; [^self concretizePushCq].<br>
                [PushCw]                        -&gt; [^self concretizePushCw].<br>
                [PrefetchAw]            -&gt; [^self concretizePrefetchAw].<br>
                &quot;Conversion&quot;<br>
                [ConvertRRd]            -&gt; [^self concretizeConvertRRd] }!<br>
<br>
Item was added:<br>
+ ----- Method: CogIA32CompilerTests&gt;&gt;testMoveAbR (in category &#39;tests&#39;) -----<br>
+ testMoveAbR<br>
+       &quot;self new testMoveAbR&quot;<br>
+       CogIA32CompilerForTests byteRegistersWithNamesDo:<br>
+               [:reg :regname|<br>
+               #(16r555555 16rAAAAAA) do:<br>
+                       [:addr| | inst len |<br>
+                       inst := self gen: MoveAbR operand: addr operand: reg.<br>
+                       len := inst concretizeAt: 0.<br>
+                       self processor<br>
+                               disassembleInstructionAt: 0<br>
+                               In: inst machineCode object<br>
+                               into: [:str :sz| | plainJane herIntended |<br>
+                                       &quot;Convert e.g. &#39;00000000: movl %eax, 0x2(%eax) : 89 40 02&#39; to  &#39;movl %eax, 0x2(%eax)&#39;&quot;<br>
+                                       plainJane := self strip: str.<br>
+                                       herIntended := &#39;movb 0x&#39;, (addr hex allButFirst: 3), &#39;, &#39;, regname.<br>
+                                       self assert: (plainJane match: herIntended).<br>
+                                       self assert: len = sz]]]!<br>
<br>
Item was added:<br>
+ ----- Method: CogIA32CompilerTests&gt;&gt;testMoveRAb (in category &#39;tests&#39;) -----<br>
+ testMoveRAb<br>
+       &quot;self new testMoveRAb&quot;<br>
+       CogIA32CompilerForTests byteRegistersWithNamesDo:<br>
+               [:reg :regname|<br>
+               #(16r555555 16rAAAAAA) do:<br>
+                       [:addr| | inst len |<br>
+                       inst := self gen: MoveRAb operand: reg operand: addr.<br>
+                       len := inst concretizeAt: 0.<br>
+                       self processor<br>
+                               disassembleInstructionAt: 0<br>
+                               In: inst machineCode object<br>
+                               into: [:str :sz| | plainJane herIntended |<br>
+                                       plainJane := self strip: str.<br>
+                                       herIntended := &#39;movb &#39;, regname, &#39;, 0x&#39;, (addr hex allButFirst: 3).<br>
+                                       self assert: (plainJane match: herIntended).<br>
+                                       self assert: len = sz]]]!<br>
<br>
Item was changed:<br>
  ----- Method: CogInLineLiteralsX64Compiler&gt;&gt;concretizeMoveCwR (in category &#39;generate machine code&#39;) -----<br>
  concretizeMoveCwR<br>
        &quot;Will get inlined into concretizeAt: switch.&quot;<br>
        &lt;inline: true&gt;<br>
        | value reg offset |<br>
        value := operands at: 0.<br>
        reg := self concreteRegister: (operands at: 1).<br>
        (self isAnInstruction: (cogit cCoerceSimple: value to: #&#39;AbstractInstruction *&#39;)) ifTrue:<br>
                [value := (cogit cCoerceSimple: value to: #&#39;AbstractInstruction *&#39;) address].<br>
        (cogit addressIsInCurrentCompilation: value) ifTrue:<br>
                [offset := value - (address + 7).<br>
                 machineCode<br>
                        at: 0 put: (self rexR: reg x: 0 b: 0);<br>
+                       at: 1 put: 16r8D; &quot;LoadEffectiveAddress&quot;<br>
+                       at: 2 put: (self mod: ModRegInd RM: 5 RO: reg);<br>
-                       at: 1 put: 16r8B;<br>
-                       at: 2 put: (self mod: ModReg RM: 5 RO: reg);<br>
                        at: 3 put: (offset bitAnd: 16rFF);<br>
                        at: 4 put: (offset &gt;&gt; 8 bitAnd: 16rFF);<br>
                        at: 5 put: (offset &gt;&gt; 16 bitAnd: 16rFF);<br>
                        at: 6 put: (offset &gt;&gt; 24 bitAnd: 16rFF).<br>
                ^machineCodeSize := 7].<br>
        machineCode<br>
                at:  0 put: (self rexR: reg x: 0 b: reg);<br>
                at:  1 put: 16rB8 + (reg bitAnd: 7);<br>
                at:  2 put: (value bitAnd: 16rFF);<br>
                at:  3 put: (value &gt;&gt; 8 bitAnd: 16rFF);<br>
                at:  4 put: (value &gt;&gt; 16 bitAnd: 16rFF);<br>
                at:  5 put: (value &gt;&gt; 24 bitAnd: 16rFF);<br>
                at:  6 put: (value &gt;&gt; 32 bitAnd: 16rFF);<br>
                at:  7 put: (value &gt;&gt; 40 bitAnd: 16rFF);<br>
                at:  8 put: (value &gt;&gt; 48 bitAnd: 16rFF);<br>
                at:  9 put: (value &gt;&gt; 56 bitAnd: 16rFF);<br>
                at: 10 put: 16r90. &quot;Add a nop to disambiguate between MoveCwR/PushCwR and ArithCwR, which ends with a (self mod: ModReg RM: 0 RO: 0)&quot;<br>
        self assert: (self mod: ModReg RM: 0 RO: 0) &gt; 16r90.<br>
        ^machineCodeSize := 11!<br>
<br>
Item was changed:<br>
  ----- Method: CogInLineLiteralsX64Compiler&gt;&gt;concretizePushCw (in category &#39;generate machine code&#39;) -----<br>
  concretizePushCw<br>
        &quot;Will get inlined into concretizeAt: switch.&quot;<br>
        &lt;inline: true&gt;<br>
        | value offset |<br>
        value := operands at: 0.<br>
        (self isAnInstruction: (cogit cCoerceSimple: value to: #&#39;AbstractInstruction *&#39;)) ifTrue:<br>
                [value := (cogit cCoerceSimple: value to: #&#39;AbstractInstruction *&#39;) address].<br>
        (cogit addressIsInCurrentCompilation: value) ifTrue:<br>
+               [offset := value - (address + 7).<br>
-               [offset := value - (address + 6).<br>
                 machineCode<br>
+                       at: 0 put: (self rexR: ConcreteRISCTempReg x: 0 b: 0);<br>
+                       at: 1 put: 16r8D; &quot;LoadEffectiveAddress&quot;<br>
+                       at: 2 put: (self mod: ModRegInd RM: 5 RO: ConcreteRISCTempReg);<br>
+                       at: 3 put: (offset bitAnd: 16rFF);<br>
+                       at: 4 put: (offset &gt;&gt; 8 bitAnd: 16rFF);<br>
+                       at: 5 put: (offset &gt;&gt; 16 bitAnd: 16rFF);<br>
+                       at: 6 put: (offset &gt;&gt; 24 bitAnd: 16rFF);<br>
+                       at: 7 put: 16r41;<br>
+                       at: 8 put: 16r48 + ConcreteRISCTempReg.<br>
+               ^machineCodeSize := 9].<br>
-                       at: 0 put: 16rFF;<br>
-                       at: 1 put: 16r35;<br>
-                       at: 2 put: (offset bitAnd: 16rFF);<br>
-                       at: 3 put: (offset &gt;&gt; 8 bitAnd: 16rFF);<br>
-                       at: 4 put: (offset &gt;&gt; 16 bitAnd: 16rFF);<br>
-                       at: 5 put: (offset &gt;&gt; 24 bitAnd: 16rFF).<br>
-               ^machineCodeSize := 6].<br>
        machineCode<br>
                at:  0 put: (self rexR: ConcreteRISCTempReg x: 0 b: ConcreteRISCTempReg);<br>
                at:  1 put: 16rB8 + (ConcreteRISCTempReg bitAnd: 7);<br>
                at:  2 put: (value bitAnd: 16rFF);<br>
                at:  3 put: (value &gt;&gt; 8 bitAnd: 16rFF);<br>
                at:  4 put: (value &gt;&gt; 16 bitAnd: 16rFF);<br>
                at:  5 put: (value &gt;&gt; 24 bitAnd: 16rFF);<br>
                at:  6 put: (value &gt;&gt; 32 bitAnd: 16rFF);<br>
                at:  7 put: (value &gt;&gt; 40 bitAnd: 16rFF);<br>
                at:  8 put: (value &gt;&gt; 48 bitAnd: 16rFF);<br>
                at:  9 put: (value &gt;&gt; 56 bitAnd: 16rFF);<br>
                at: 10 put: 16r41;<br>
+               at: 11 put: 16r48 + ConcreteRISCTempReg. &quot;The 48 will disambiguate between MoveCwR, PushCwR and ArithCwR, which ends with a (self mod: ModReg RM: 0 RO: 0)&quot;<br>
-               at: 11 put: 16r50 + (ConcreteRISCTempReg - 8). &quot;The 50 will disambiguate between MoveCwR, PushCwR and ArithCwR, which ends with a (self mod: ModReg RM: 0 RO: 0)&quot;<br>
                self assert: ConcreteRISCTempReg &gt;= 8.<br>
        self assert: (self mod: ModReg RM: 0 RO: 0) &gt; 16r57.<br>
        ^machineCodeSize := 12!<br>
<br>
Item was changed:<br>
  ----- Method: CogObjectRepresentationFor64BitSpur&gt;&gt;genInnerPrimitiveNew: (in category &#39;primitive generators&#39;) -----<br>
  genInnerPrimitiveNew: retNoffset<br>
        &quot;Implement primitiveNew for convenient cases:<br>
        - the receiver has a hash<br>
        - the receiver is fixed size (excluding ephemerons to save instructions &amp; miniscule time)<br>
        - single word header/num slots &lt; numSlotsMask<br>
        - the result fits in eden (actually below scavengeThreshold)&quot;<br>
<br>
        | headerReg fillReg instSpecReg byteSizeReg<br>
          jumpUnhashed jumpVariableOrEphemeron jumpNoSpace jumpTooBig jumpHasSlots<br>
          fillLoop skip |<br>
        &lt;var: &#39;skip&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;fillLoop&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpTooBig&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpHasSlots&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpNoSpace&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpUnhashed&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpVariableOrEphemeron&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
<br>
        &quot;header will contain classIndex/class&#39;s hash &amp; format &amp; numSlots/fixed size and finally fill value (nilObject).&quot;<br>
-       self break.<br>
        headerReg := fillReg := SendNumArgsReg.<br>
        &quot;inst spec will hold class&#39;s instance specification, then byte size and finally end of new object.&quot;<br>
        instSpecReg := byteSizeReg := ClassReg.<br>
<br>
        &quot;get freeStart as early as possible so as not to wait later...&quot;<br>
        cogit MoveAw: objectMemory freeStartAddress R: Arg1Reg.<br>
        &quot;get class&#39;s hash &amp; fail if 0&quot;<br>
        self genGetHashFieldNonImmOf: ReceiverResultReg into: headerReg.<br>
        jumpUnhashed := cogit JumpZero: 0.<br>
        &quot;get class&#39;s format inst var for both inst spec (format field) and num fixed fields&quot;<br>
        self genLoadSlot: InstanceSpecificationIndex sourceReg: ReceiverResultReg destReg: TempReg.<br>
        self genConvertSmallIntegerToIntegerInReg: TempReg.<br>
        cogit MoveR: TempReg R: instSpecReg.<br>
        cogit LogicalShiftRightCq: objectMemory fixedFieldsFieldWidth R: TempReg.<br>
        cogit AndCq: objectMemory formatMask R: TempReg.<br>
        cogit AndCq: objectMemory fixedFieldsOfClassFormatMask R: instSpecReg.<br>
        &quot;fail if not fixed or if ephemeron (rare beasts so save the cycles)&quot;<br>
        cogit CmpCq: objectMemory nonIndexablePointerFormat R: TempReg.<br>
        jumpVariableOrEphemeron := cogit JumpAbove: 0.<br>
        cogit CmpCq: objectMemory numSlotsMask R: instSpecReg.<br>
        jumpTooBig := cogit JumpAboveOrEqual: 0.<br>
        &quot;Add format to classIndex/format in header; the add in numSlots&quot;<br>
        cogit LogicalShiftLeftCq: objectMemory formatShift R: TempReg.<br>
        cogit AddR: TempReg R: headerReg.<br>
        cogit MoveR: instSpecReg R: TempReg.<br>
        cogit LogicalShiftLeftCq: objectMemory numSlotsFullShift R: TempReg.<br>
        cogit AddR: TempReg R: headerReg.<br>
        &quot;compute byte size; remember 0-sized objects still need 1 slot.&quot;<br>
        cogit CmpCq: 0 R: byteSizeReg. &quot;a.k.a. instSpecReg&quot;<br>
        jumpHasSlots := cogit JumpNonZero: 0.<br>
        cogit MoveCq: objectMemory baseHeaderSize * 2 R: byteSizeReg.<br>
        skip := cogit Jump: 0.<br>
        &quot;round up to allocationUnit&quot;<br>
        jumpHasSlots jmpTarget:<br>
        (cogit AddCq: objectMemory baseHeaderSize / objectMemory wordSize R: byteSizeReg).<br>
        cogit LogicalShiftLeftCq: objectMemory shiftForWord R: byteSizeReg.<br>
        skip jmpTarget:<br>
        &quot;check if allocation fits (freeSize + byteSize &lt; scavengeThreshold); scavengeThreshold is constant.&quot;<br>
        (cogit AddR: Arg1Reg R: byteSizeReg).<br>
        cogit CmpCq: objectMemory getScavengeThreshold R: byteSizeReg.<br>
        jumpNoSpace := cogit JumpAboveOrEqual: 0.<br>
        &quot;write back new freeStart; get result. byteSizeReg holds new freeStart, the limit of the object&quot;<br>
        cogit MoveR: byteSizeReg Aw: objectMemory freeStartAddress.<br>
        cogit MoveR: Arg1Reg R: ReceiverResultReg.<br>
        &quot;write header&quot;<br>
        cogit MoveR: headerReg Mw: 0 r: Arg1Reg.<br>
        &quot;now fill&quot;<br>
        cogit LoadEffectiveAddressMw: objectMemory baseHeaderSize r: ReceiverResultReg R: Arg1Reg.<br>
        cogit MoveCq: objectMemory nilObject R: fillReg.<br>
        fillLoop :=<br>
        cogit MoveR: fillReg Mw: 0 r: Arg1Reg.<br>
        cogit AddCq: 8 R: Arg1Reg.<br>
        cogit CmpR: Arg1Reg R: byteSizeReg.<br>
        cogit JumpAbove: fillLoop.<br>
        cogit RetN: retNoffset.<br>
<br>
        jumpUnhashed jmpTarget:<br>
        (jumpVariableOrEphemeron jmpTarget:<br>
        (jumpTooBig jmpTarget:<br>
        (jumpNoSpace jmpTarget: cogit Label))).<br>
<br>
        ^0!<br>
<br>
Item was changed:<br>
  ----- Method: CogObjectRepresentationFor64BitSpur&gt;&gt;genInnerPrimitiveNewWithArg: (in category &#39;primitive generators&#39;) -----<br>
  genInnerPrimitiveNewWithArg: retNoffset<br>
        &quot;Implement primitiveNewWithArg for convenient cases:<br>
        - the receiver has a hash<br>
        - the receiver is variable and not compiled method<br>
        - single word header/num slots &lt; numSlotsMask<br>
        - the result fits in eden<br>
        See superclass method for dynamic frequencies of formats.<br>
        For the moment we implement only arrayFormat, firstByteFormat &amp; firstLongFormat&quot;<br>
<br>
        | headerReg fillReg instSpecReg byteSizeReg maxSlots<br>
          jumpArrayTooBig jumpByteTooBig jumpLongTooBig<br>
          jumpArrayFormat jumpByteFormat jumpBytePrepDone jumpLongPrepDone<br>
          jumpUnhashed jumpNElementsNonInt jumpFailCuzFixed jumpNoSpace jumpHasSlots fillLoop skip |<br>
        &lt;var: &#39;skip&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;fillLoop&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpHasSlots&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpNoSpace&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpUnhashed&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpByteFormat&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpByteTooBig&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpLongTooBig&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpArrayFormat&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpArrayTooBig&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpFailCuzFixed&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpBytePrepDone&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpLongPrepDone&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
        &lt;var: &#39;jumpNElementsNonInt&#39; type: #&#39;AbstractInstruction *&#39;&gt;<br>
<br>
        &quot;header will contain cl</blockquote></div></div></div></blockquote></div></div><br>...</blockquote></div>