<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 8, 2014 at 2:43 PM, Tobias Pape <span dir="ltr">&lt;<a href="mailto:Das.Linux@gmx.de" target="_blank">Das.Linux@gmx.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br>Hi,<br>
<br>
On 08.09.2014, at 23:23, David T. Lewis &lt;<a href="mailto:lewis@mail.msen.com">lewis@mail.msen.com</a>&gt; wrote:<br>
<br>
&gt;<br>
&gt; Hi Eliot,<br>
&gt;<br>
&gt; Agreed, the primitive will need to be rewritten to work with a 64-bit<br>
&gt; SmallInteger. There may be other integer primitives that will need<br>
&gt; attention too, although I have not looked.<br>
&gt;<br>
<br>
Having tried implementing other SqueakVMs, my impression is, that the<br>
SmallInt-is-31-bit assumption is like everywhere. Starting with some<br>
int-primitives and not ending with bitBlt. We really have to be careful<br>
here.<br></blockquote><div><br></div><div>That&#39;s what tests and sheer bloody-mindedness are for ;-)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Best<br>
        -Tobias<br>
<br>
&gt; Dave<br>
&gt;<br>
&gt;&gt; Hi David,<br>
&gt;&gt;<br>
&gt;&gt; On Mon, Sep 8, 2014 at 12:18 PM, David T. Lewis &lt;<a href="mailto:lewis@mail.msen.com">lewis@mail.msen.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I know that &quot;unsigned&quot; means &quot;unsigned int&quot;. That is the intent.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; With the primitive as currently implemented, that variable must be 32<br>
&gt;&gt;&gt; bits, otherwise the shift left can successfully produce a five byte<br>
&gt;&gt;&gt; large<br>
&gt;&gt;&gt; integer that is truncated to four without failing the primitive. This<br>
&gt;&gt;&gt; change is to fix the current implementation of the primitive in the case<br>
&gt;&gt;&gt; of sizeof(sqInt) == 8.<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; OK, then it is fixing it in a way that will break a 64-bit implementation<br>
&gt;&gt; that uses 64-bit SmallIntegers.   Personally I find the method defective<br>
&gt;&gt; (for reasons already stated), and will be rewriting it soon.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt; Dave<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Hi David,<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;   and another issue is that &quot;unsigned&quot; is shorthand for &quot;unsigned<br>
&gt;&gt;&gt; int&quot;,<br>
&gt;&gt;&gt;&gt; so<br>
&gt;&gt;&gt;&gt; if you wanted to generalize the method to handle integers of the<br>
&gt;&gt;&gt; system&#39;s<br>
&gt;&gt;&gt;&gt; word size (as is the case with 64-bit Spur which will have 61-bit<br>
&gt;&gt;&gt;&gt; SmallIntegers, unlike the 31-bit SmallIntegers in 64-bit Squeak) you&#39;d<br>
&gt;&gt;&gt;&gt; want<br>
&gt;&gt;&gt;&gt; to use &quot;usqInt&quot;, not &quot;unsigned&quot;.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On Sat, Sep 6, 2014 at 8:45 PM, &lt;<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; David T. Lewis uploaded a new version of VMMaker to project VM Maker:<br>
&gt;&gt;&gt;&gt;&gt; <a href="http://source.squeak.org/VMMaker/VMMaker-dtl.350.mcz" target="_blank">http://source.squeak.org/VMMaker/VMMaker-dtl.350.mcz</a><br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; ==================== Summary ====================<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Name: VMMaker-dtl.350<br>
&gt;&gt;&gt;&gt;&gt; Author: dtl<br>
&gt;&gt;&gt;&gt;&gt; Time: 6 September 2014, 11:44:28.389 pm<br>
&gt;&gt;&gt;&gt;&gt; UUID: 2ad132b0-5fb3-4580-b5a8-29af12c3cb81<br>
&gt;&gt;&gt;&gt;&gt; Ancestors: VMMaker-dtl.349<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; VMMaker 4.13.6<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Fix primitiveBitShift (primitive 17) for sqInt declared 64 bits, as<br>
&gt;&gt;&gt; in a<br>
&gt;&gt;&gt;&gt;&gt; VM for 64-bit image format 68002.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; In image format 68002, bit shift left failed because of return type<br>
&gt;&gt;&gt;&gt;&gt; limited to a 32-bit large integer, but internally the primitive<br>
&gt;&gt;&gt;&gt;&gt; successfully shifted left into a variable declared as a 64 bit<br>
&gt;&gt;&gt; sqInt..<br>
&gt;&gt;&gt;&gt;&gt; The<br>
&gt;&gt;&gt;&gt;&gt; simple fix (implemented here) is to declare the variable as 32 bit<br>
&gt;&gt;&gt;&gt;&gt; unsigned<br>
&gt;&gt;&gt;&gt;&gt; to agree with the 32-bit logic of the existing primitive.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Note that permitting a left shift into a 64 bit variable makes sense<br>
&gt;&gt;&gt;&gt;&gt; generally, and the primitive could be recoded to accomodate this for<br>
&gt;&gt;&gt;&gt;&gt; shift<br>
&gt;&gt;&gt;&gt;&gt; left, with the primitive answering positive64BitIntegerFor: rather<br>
&gt;&gt;&gt; than<br>
&gt;&gt;&gt;&gt;&gt; positive32BitIntegerFor: in the case of a shift left to allow for the<br>
&gt;&gt;&gt;&gt;&gt; greater range (not implemented in this update).<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; With this update, all KernelTests-Numbers tests pass for the 64-bit<br>
&gt;&gt;&gt;&gt;&gt; image<br>
&gt;&gt;&gt;&gt;&gt; format 68002.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; =============== Diff against VMMaker-dtl.349 ===============<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Item was changed:<br>
&gt;&gt;&gt;&gt;&gt;  ----- Method: InterpreterPrimitives&gt;&gt;primitiveBitShift (in category<br>
&gt;&gt;&gt;&gt;&gt; &#39;arithmetic integer primitives&#39;) -----<br>
&gt;&gt;&gt;&gt;&gt;  primitiveBitShift<br>
&gt;&gt;&gt;&gt;&gt;        | integerReceiver integerArgument shifted |<br>
&gt;&gt;&gt;&gt;&gt; +       &lt;var: #shifted type: &#39;unsigned&#39;&gt;<br>
&gt;&gt;&gt;&gt;&gt; +<br>
&gt;&gt;&gt;&gt;&gt;        integerArgument := self popInteger.<br>
&gt;&gt;&gt;&gt;&gt;        integerReceiver := self popPos32BitInteger.<br>
&gt;&gt;&gt;&gt;&gt;        self successful ifTrue: [<br>
&gt;&gt;&gt;&gt;&gt;                integerArgument &gt;= 0 ifTrue: [<br>
&gt;&gt;&gt;&gt;&gt;                        &quot;Left shift -- must fail if we lose bits<br>
&gt;&gt;&gt; beyond<br>
&gt;&gt;&gt;&gt;&gt; 32&quot;<br>
&gt;&gt;&gt;&gt;&gt;                        self success: integerArgument &lt;= 31.<br>
&gt;&gt;&gt;&gt;&gt;                        shifted := integerReceiver &lt;&lt;<br>
&gt;&gt;&gt; integerArgument.<br>
&gt;&gt;&gt;&gt;&gt;                        self success: (shifted &gt;&gt; integerArgument) =<br>
&gt;&gt;&gt;&gt;&gt; integerReceiver.<br>
&gt;&gt;&gt;&gt;&gt;                ] ifFalse: [<br>
&gt;&gt;&gt;&gt;&gt;                        &quot;Right shift -- OK to lose bits&quot;<br>
&gt;&gt;&gt;&gt;&gt;                        self success: integerArgument &gt;= -31.<br>
&gt;&gt;&gt;&gt;&gt;                        shifted := integerReceiver &gt;&gt; (0 -<br>
&gt;&gt;&gt;&gt;&gt; integerArgument).<br>
&gt;&gt;&gt;&gt;&gt;                ].<br>
&gt;&gt;&gt;&gt;&gt;        ].<br>
&gt;&gt;&gt;&gt;&gt;        self successful<br>
&gt;&gt;&gt;&gt;&gt;                ifTrue: [self push: (self positive32BitIntegerFor:<br>
&gt;&gt;&gt;&gt;&gt; shifted)]<br>
&gt;&gt;&gt;&gt;&gt;                ifFalse: [self unPop: 2]!<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Item was changed:<br>
&gt;&gt;&gt;&gt;&gt;  ----- Method: VMMaker class&gt;&gt;versionString (in category &#39;version<br>
&gt;&gt;&gt;&gt;&gt; testing&#39;) -----<br>
&gt;&gt;&gt;&gt;&gt;  versionString<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;        &quot;VMMaker versionString&quot;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; +       ^&#39;4.13.6&#39;!<br>
&gt;&gt;&gt;&gt;&gt; -       ^&#39;4.13.7&#39;!<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; --<br>
&gt;&gt;&gt;&gt; best,<br>
&gt;&gt;&gt;&gt; Eliot<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; best,<br>
&gt;&gt; Eliot<br>
<br>
<br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div>
</div></div>