<br><br><div class="gmail_quote">On Fri, Sep 21, 2012 at 9:25 AM, Igor Stasenko <span dir="ltr">&lt;<a href="mailto:siguctua@gmail.com" target="_blank">siguctua@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
On 21 September 2012 17:53, Denis Kudriashov &lt;<a href="mailto:dionisiydk@gmail.com">dionisiydk@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hello<br>
<div class="im">&gt;<br>
&gt; 2012/9/21 Igor Stasenko &lt;<a href="mailto:siguctua@gmail.com">siguctua@gmail.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt; nbFoo2<br>
&gt;&gt;         &lt;primitive: #primitiveNativeCall module: #NativeBoostPlugin error: errorCode&gt;<br>
&gt;&gt;<br>
&gt;&gt;         ^ NBNativeCodeGen methodAssembly: [:gen :proxy :asm |<br>
&gt;&gt;                 asm noStackFrame.<br>
&gt;&gt;                 asm<br>
&gt;&gt;                         mov: (42 &lt;&lt; 1) + 1 to: asm EAX;<br>
&gt;&gt;                         ret.<br>
&gt;&gt;         ]<br>
&gt;&gt;<br>
&gt;&gt; And this one uses JIT:<br>
&gt;&gt;<br>
&gt;&gt; nbFoo<br>
&gt;&gt;         &lt;primitive: 220 error: errorCode&gt;<br>
&gt;&gt;<br>
&gt;&gt;         [ errorCode = ErrRunningViaInterpreter  ] whileTrue: [ ^ self nbFoo ].<br>
&gt;&gt;<br>
&gt;&gt;         ^ NBNativeCodeGen jitMethodAssembly: [:gen :proxy :asm |<br>
&gt;&gt;                 asm noStackFrame.<br>
&gt;&gt;                 asm<br>
&gt;&gt;                         mov: (42 &lt;&lt; 1) + 1 to: asm EDX;<br>
&gt;&gt;                         ret: 4 asUImm.<br>
&gt;&gt;         ]<br>
&gt;<br>
&gt;<br>
</div>&gt; Why assembly code is different for jitted and non jitted versions?<br>
<br>
<br>
In short: because Cog JIT code uses different convention(s).<br>
One of them is return value should be in EDX, unlike from cdecl<br>
convention, which is EAX.<br>
<br>
<br>
&gt; What I should change in my nativeboost assembly to be able to jit it?<br>
&gt;<br>
<br>
i think, most of the time it is entry and leave code..<br>
and accessing method&#39;s argument(s). The rest, like calling<br>
interpreterProxy&#39;s functions<br>
can be left unchanged.<br>
Also, it must be noted, that JIT code uses own stack and making calls<br>
to C functions<br>
might be very dangerous (overflow stack) unless you know that C<br>
function won&#39;t consume much stack space.<br>
 (otherwise you need to temporary switch stack when doing such calls).<br></blockquote><div><br></div><div>Exactly.  The Smalltalk stack is paged, about 1k bytes per page, all part of the context-to-stack mapping scheme.  One can&#39;t run general C code on that stack.  Only code which is known not to consume stack space could be used safely.  Instead, as NB does, the JIT generates machine code for certain performance-critical primitives and runs them directly on the Smalltalk stack.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
I don&#39;t know too much details right now, but Eliot knows better<br>
because he wrote it :)<br>
<br>
<br>
&gt; Any way thank&#39;s for such impressive work.<br>
&gt;<br>
&gt; Best regards,<br>
&gt; Denis<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
--<br>
Best regards,<br>
Igor Stasenko.<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div><br>