<div dir="ltr"><div>@Rochus</div><div><br></div><div>To emulate variable parameters in the JVM, I am using a lighter approach than your thunk based method.</div>Given the following example:<br><div><br></div><font size="2"><span style="font-family:monospace">MODULE VarParam;<br>  IMPORT Out;<br>  VAR<br>    i: INTEGER;<br><br>  PROCEDURE P(VAR i: INTEGER);<br>  BEGIN<br>    i := 10<br>  END P;<br><br>BEGIN<br>  P(i);<br>  Out.Int(i, 3); Out.Ln (* It prints 10 *)<br></span></font><div><font size="2"><span style="font-family:monospace">END VarParam.</span></font></div><div><br></div><div><span style="font-family:arial,sans-serif">oberonc</span> will emit the bytecode of an equivalent Java class as follows:</div><div><br></div><div><span style="font-family:monospace">public final class VarParam {<br>  public static int i;<br><br>  public static final void P(int[] var0) {<br>    var0[0] = 10;<br>  }<br><br>  static {<br>    int[] var0 = new int[]{i};<br>    P(var0);<br>    i = var0[0];<br>    Out.Int(i, 3);<br>    Out.Ln();<br>  }<br>}</span></div><div><br></div><div>As you can see, I wrap a var parameter in a one element array before the call, and unwrap it after the call. It is possible to generate the code above in one pass. Maybe you could see if a similar approach is faster in LuaJit.</div><div><br></div><div>I did not manage to compile your project nor, OBNC, so I cannot compare the performance of Hennessy.Mod.</div><div>Using oberonc, on my machine I get:<br><span style="font-family:monospace">Perm       16<br>Towers        5<br>Queens        6<br>Intmm       12<br>Mm       10<br>Quick       13<br>Bubble       19<br>Tree       17<br>FFT       30<br>Nonfloating point composite is 166.500000<br>Floating point composite is 328.899994</span></div><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">If I measure the total execution time, I get about 122 milliseconds.</font></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">I have found some corner case bugs in my compiler while trying out OBNC tests. I will fix them soon.<br></font></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif"><br></font></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">Cheers, <br></font></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">Luca<br></font></span></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Oct 12, 2019 at 6:26 AM <a href="mailto:rochus.keller@bluewin.ch">rochus.keller@bluewin.ch</a> <<a href="mailto:rochus.keller@bluewin.ch">rochus.keller@bluewin.ch</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">@ Luca Boasso:<br>
<br>
Meanwhile I found some time to further analyze the generated IR and machine code using the -jdump option of LuaJIT. <br>
<br>
If you have this Lua code "increment(function(set,val) if set then x =  val else return x end end)" as in LuaDemo2 of my article then LuaJIT indeed finds the following trace into increment() and the thunk but then aborts because it cannot handle traces including the FNEW opcode as it seems:<br>
<br>
---- TRACE 2 start 1/0 VarDemo1.lua:10<br>
0001  ISF          0<br>
0002  JMP      2 => 0005<br>
0005  UGET     2   0      ; x<br>
0006  RET1     2   2<br>
0005  ADDVN    3   3   0  ; 1<br>
0006  CALL     1   1   3<br>
0000  . JFUNCF   3   1         ; VarDemo1.lua:10<br>
0001  . ISF          0<br>
0002  . JMP      2 => 0005<br>
0003  . USETV    0   1      ; x<br>
0004  . JMP      2 => 0007<br>
0007  . RET0     0   1<br>
0007  RET0     0   1<br>
0014  FORL     3 => 0011<br>
0011  MOV      7   1<br>
0012  FNEW     8   3      ; VarDemo1.lua:10<br>
---- TRACE 2 abort VarDemo1.lua:10 -- NYI: bytecode 49 ; FNEW<br>
<br>
If I don't define the thunk inline but use a local variable for the thunk instead, full inlining works and the runtime is as fast as corresponding C code.<br>
<br>
I therefore need to redesign my Lua code generator to no longer inline the thunk definitions and to even take the thunk declarations out of loops. To do that I likely need a separate optimization pass to rewrite the AST which is not feasible with my current, syntax directed approach. I will come back with results.<br>
<br>
Best<br>
R.<br>
--<br>
<a href="mailto:Oberon@lists.inf.ethz.ch" target="_blank">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
<a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" rel="noreferrer" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
</blockquote></div>