<html><head></head><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:16px"><div id="yui_3_16_0_ym19_1_1476379454522_106991"><span id="yui_3_16_0_ym19_1_1476379454522_107217">But there are many instances, especially when dealing with bit manipulation, where there is a huge penalty.&nbsp; On most occasions, SmallInteger are 3 times faster than LargePositiveInteger.&nbsp; And in my very particular case (bitboards for a chess engine), using all 64 bits is a must.<br></span></div><div id="yui_3_16_0_ym19_1_1476379454522_107379"><span id="yui_3_16_0_ym19_1_1476379454522_107217"><br></span></div><div id="yui_3_16_0_ym19_1_1476379454522_107392"><span id="yui_3_16_0_ym19_1_1476379454522_107217"><br></span></div><div id="yui_3_16_0_ym19_1_1476379454522_107393"><span id="yui_3_16_0_ym19_1_1476379454522_107217">To clearly see my problem, try this :</span></div><div id="yui_3_16_0_ym19_1_1476379454522_107254"><span id="yui_3_16_0_ym19_1_1476379454522_107217"><br></span></div><div dir="ltr" id="yui_3_16_0_ym19_1_1476379454522_107313"><span id="yui_3_16_0_ym19_1_1476379454522_107217">| n timeSmall timeLarge |<br id="yui_3_16_0_ym19_1_1476379454522_107275">small1 := 1 &lt;&lt; 59.<br id="yui_3_16_0_ym19_1_1476379454522_107276">small2 := 1 &lt;&lt; 49.<br id="yui_3_16_0_ym19_1_1476379454522_107277">large1 := 1 &lt;&lt; 60.<br id="yui_3_16_0_ym19_1_1476379454522_107278">large2 := 1 &lt;&lt; 62.<br id="yui_3_16_0_ym19_1_1476379454522_107279"><br id="yui_3_16_0_ym19_1_1476379454522_107280">n := 100000000.<br id="yui_3_16_0_ym19_1_1476379454522_107281">timeSmall := Time millisecondsToRun: [n timesRepeat: [ small1 bitXor:&nbsp; small2]].<br id="yui_3_16_0_ym19_1_1476379454522_107282">timeLarge := Time millisecondsToRun: [n timesRepeat: [ large1 bitXor:&nbsp; large2]].<br id="yui_3_16_0_ym19_1_1476379454522_107283">Transcript cr;show: 'Time LargePositiveInteger : ', timeLarge printString.<br id="yui_3_16_0_ym19_1_1476379454522_107284">Transcript cr;show: 'Time SmallInteger : ', timeSmall printString.</span></div><div dir="ltr" id="yui_3_16_0_ym19_1_1476379454522_107336"><span id="yui_3_16_0_ym19_1_1476379454522_107217"><br></span></div><div dir="ltr" id="yui_3_16_0_ym19_1_1476379454522_107338"><span id="yui_3_16_0_ym19_1_1476379454522_107217">I get this result:</span></div><div dir="ltr"><span id="yui_3_16_0_ym19_1_1476379454522_107217"><br></span></div><div dir="ltr" id="yui_3_16_0_ym19_1_1476379454522_107376"><span id="yui_3_16_0_ym19_1_1476379454522_107217">Time LargePositiveInteger : 11028<br id="yui_3_16_0_ym19_1_1476379454522_107323">Time SmallInteger : 3315</span></div><div id="yui_3_16_0_ym19_1_1476379454522_107218">&nbsp;</div><div class="signature" id="yui_3_16_0_ym19_1_1476379454522_107220">----------------- <br>Benoît St-Jean <br>Yahoo! Messenger: bstjean
 <br>Twitter: @BenLeChialeux
 <br>Pinterest: benoitstjean
 <br>Instagram: Chef_Benito<br>IRC: lamneth
 <br>Blogue: endormitoire.wordpress.com
 <br>"A standpoint is an intellectual horizon of radius zero".&nbsp; (A. Einstein)</div><div class="qtdSeparateBR"><br><br></div><div class="yahoo_quoted" id="yui_3_16_0_ym19_1_1476379454522_107352" style="display: block;">  <div style="font-family: times new roman, new york, times, serif; font-size: 16px;" id="yui_3_16_0_ym19_1_1476379454522_107351"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" id="yui_3_16_0_ym19_1_1476379454522_107350"> <div dir="ltr" id="yui_3_16_0_ym19_1_1476379454522_107375"> <font size="2" face="Arial"> <hr size="1"> <b><span style="font-weight:bold;">From:</span></b> Nicolas Cellier &lt;nicolas.cellier.aka.nice@gmail.com&gt;<br> <b><span style="font-weight: bold;">To:</span></b> Benoit St-Jean &lt;bstjean@yahoo.com&gt;; The general-purpose Squeak developers list &lt;squeak-dev@lists.squeakfoundation.org&gt; <br> <b><span style="font-weight: bold;">Sent:</span></b> Friday, October 14, 2016 5:09 PM<br> <b><span style="font-weight: bold;">Subject:</span></b> Re: [squeak-dev] 64 bit integer arithmetic<br> </font> </div> <div class="y_msg_container" id="yui_3_16_0_ym19_1_1476379454522_107349"><br><div id="yiv3520496251"><div id="yui_3_16_0_ym19_1_1476379454522_107348"><div dir="ltr" id="yui_3_16_0_ym19_1_1476379454522_107347"><div id="yui_3_16_0_ym19_1_1476379454522_107346"><div id="yui_3_16_0_ym19_1_1476379454522_107345"><div id="yui_3_16_0_ym19_1_1476379454522_107344"><div id="yui_3_16_0_ym19_1_1476379454522_107343"><div id="yui_3_16_0_ym19_1_1476379454522_107342"><div id="yui_3_16_0_ym19_1_1476379454522_107341"><div id="yui_3_16_0_ym19_1_1476379454522_107340"><div><div>But the 32bits VM is already dealing with 64 bits integers specially.<br clear="none"></div>Take + for example.<br clear="none"></div>SmallInteger&gt;&gt;+ calls primitive: 1 (that is primitiveAdd)<br clear="none">LargePositiveInteger&gt;&gt;+ calls primitive: 21 (that is primitiveAddLargeIntegers)<br clear="none"></div>Integer&gt;&gt;+ call digitAdd: which calls primitive: 'primDigitAdd' module:'LargeIntegers'<br clear="none"><br clear="none"></div>So what happens if you peform 1&lt;&lt;63+1 ?<br clear="none"></div>It calls primitive: 21 which is doing this:<br clear="none">primitiveAddLargeIntegers<br clear="none">&nbsp;&nbsp;&nbsp; "Primitive arithmetic operations for large integers in 64 bit range"<br clear="none">&nbsp;&nbsp;&nbsp; | a b result oopResult aIsNegative bIsNegative resultIsNegative oopArg oopRcvr |<br clear="none">&nbsp;&nbsp;&nbsp; &lt;export: true&gt;<br clear="none">&nbsp;&nbsp;&nbsp; &lt;var: 'a' type: 'usqLong'&gt;<br clear="none">&nbsp;&nbsp;&nbsp; &lt;var: 'b' type: 'usqLong'&gt;<br clear="none">&nbsp;&nbsp;&nbsp; &lt;var: 'result' type: 'usqLong'&gt;<br clear="none"><br clear="none">&nbsp;&nbsp;&nbsp; oopArg := self stackValue: 0.<br clear="none">&nbsp;&nbsp;&nbsp; oopRcvr := self stackValue: 1.<br clear="none">&nbsp;&nbsp;&nbsp; aIsNegative := self isNegativeIntegerValueOf: oopRcvr.<br clear="none">&nbsp;&nbsp;&nbsp; bIsNegative := self isNegativeIntegerValueOf: oopArg.<br clear="none">&nbsp;&nbsp;&nbsp; a := self magnitude64BitValueOf: oopRcvr.<br clear="none">&nbsp;&nbsp;&nbsp; b := self magnitude64BitValueOf: oopArg.<br clear="none">&nbsp;&nbsp;&nbsp; self successful ifFalse:[^nil].<br clear="none">&nbsp;&nbsp;&nbsp; (aIsNegative = bIsNegative)<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ifTrue:<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ["Protect against overflow"<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a &gt; (16rFFFFFFFFFFFFFFFF - b) ifTrue: [self primitiveFail. ^nil].<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := a + b.<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; resultIsNegative := aIsNegative]<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ifFalse:<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [(a &gt;= b)<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ifTrue:<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [result := a - b.<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; resultIsNegative := aIsNegative]<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ifFalse:<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [result := b - a.<br clear="none">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; resultIsNegative := bIsNegative]].<br clear="none">&nbsp;&nbsp;&nbsp; oopResult := self magnitude64BitIntegerFor: result neg: resultIsNegative.<br clear="none">&nbsp;&nbsp;&nbsp; self successful ifTrue:[self pop: 2 thenPush: oopResult].<br clear="none"><br clear="none"></div>So you see, it just perform 64 bits arithmetic primitively.<br clear="none"><br clear="none"></div>However, if you do 1+(1&lt;&lt;63), then you invoke:<br clear="none">primitiveAdd<br clear="none"><br clear="none">&nbsp;&nbsp;&nbsp; self pop2AndPushIntegerIfOK: (self stackIntegerValue: 1) + (self stackIntegerValue: 0)<br clear="none"><br clear="none"></div>That will fail because the argument is not a SmallInteger. Then you fallback to Integer&gt;&gt;+ which invokes digitAdd:<br clear="none"><br clear="none"></div>The only thing that changes with 64bits spur VM is that SmallInteger have 61bits and can represent any int in ((1&lt;&lt;60) negated to: (1&lt;&lt;60-1)). So 1+(1&lt;&lt;59) would still be a SmallInteger, but the other examples above would run unchanged.<br clear="none"><div><div><div><div><br clear="none"><br clear="none"></div></div></div></div></div><div class="yiv3520496251gmail_extra"><br clear="none"><div class="yiv3520496251gmail_quote">2016-10-14 0:22 GMT+02:00 Benoit St-Jean <span dir="ltr">&lt;<a rel="nofollow" shape="rect" ymailto="mailto:bstjean@yahoo.com" target="_blank" href="mailto:bstjean@yahoo.com">bstjean@yahoo.com</a>&gt;</span>:<br clear="none"><div class="yiv3520496251yqt5083585145" id="yiv3520496251yqt34673"><blockquote class="yiv3520496251gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div style="color:#000;background-color:#fff;font-family:times new roman, new york, times, serif;font-size:16px;"><div dir="ltr" id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_45744"><span id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_46014">I was wondering if the 64-bit VM (such as the one for Squeak 5.1) will support 64-bit integer arithmetic with primitives for positive integers.&nbsp; Right now, 64 positive integers support bitwise operations but through code (LargePositiveInteger).&nbsp; Any plan to move those calculations/operations to primitives to speed things up?&nbsp; <br clear="none"></span></div><div dir="ltr" id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_46058"><span id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_46014"><br clear="none"></span></div><div dir="ltr" id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_46100"><span id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_46014">That would be so wonderful and nice for someone like me wanting to fully use a 64-bit architecture &amp; Squeak/Cog/Pharo/Whatever/VM for a chess engine project!</span></div><div id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_45883">&nbsp;</div><div class="yiv3520496251m_3839342526852660740signature" id="yiv3520496251m_3839342526852660740yui_3_16_0_ym19_1_1476379454522_45831">----------------- <br clear="none">Benoît St-Jean <br clear="none">Yahoo! Messenger: bstjean
 <br clear="none">Twitter: @BenLeChialeux
 <br clear="none">Pinterest: benoitstjean
 <br clear="none">Instagram: Chef_Benito<br clear="none">IRC: lamneth
 <br clear="none">Blogue: <a rel="nofollow" shape="rect" target="_blank" href="http://endormitoire.wordpress.com/">endormitoire.wordpress.com</a>
 <br clear="none">"A standpoint is an intellectual horizon of radius zero".&nbsp; (A. Einstein)</div></div></div><br clear="none"><br clear="none">
<br clear="none"></blockquote></div></div><br clear="none"></div></div></div><br><br></div> </div> </div>  </div></div></body></html>