Initial import.

  This project is an example of using GNU lightning to generate a
complex virtual machine implementing a dynamically typed C/C++ like
language.

  Note that it uses https://savannah.gnu.org/projects/lightning/
and not https://github.com/pcpa/lightning. Also, it uses the latest
git checkout of GNU lightning as of this time, as it allowed to
find and correct some bugs not fixed in the latest official of
GNU lightning, that was version 2.0.1.

  The language is a rehash and a more efficient version of
https://code.google.com/p/exl/

  The language is not so simple because of being dynamically typed,
and is still being "rewritten". The check/test file is an example
of tests of currently implemented code.

  The vm has a significantly large "prolog" to setup the vm, thread,
exception handlers, etc. But a simple example to have an idea of
the current code on x86_64 Linux is:

$ cat > t
int64_t a, b;
for (a = b = 0;
     a < 10000000;
     ++a)
        b += a;
print("%d %d\n", a, b);

$ /usr/bin/time ./owl -v < t

int64_t a, b;
for (a = b = 0; a < 10000000; ++a)
    b += a;
print("%d %d\n", a, b);
    0x7f7be4511000      sub    $0x30,%rsp
    0x7f7be4511004      mov    %rbx,0x28(%rsp)
    0x7f7be4511009      mov    %r12,0x20(%rsp)
    0x7f7be451100e      mov    %r13,0x18(%rsp)
    0x7f7be4511013      mov    %r14,0x10(%rsp)
    0x7f7be4511018      mov    %r15,0x8(%rsp)
    0x7f7be451101d      mov    %rbp,(%rsp)
    0x7f7be4511021      mov    %rsp,%rbp
    0x7f7be4511024      sub    $0x38,%rsp
    0x7f7be4511028      mov    %rdi,%rbx
    0x7f7be451102b      lea    0x340(%rbx),%rax
    0x7f7be4511032      mov    %rax,%rdi
    0x7f7be4511035      mov    $0x1,%esi
    0x7f7be451103a      movabs $0x3c3ce37000,%r10
    0x7f7be4511044      callq  *%r10
    0x7f7be4511047      movslq %eax,%rax
    0x7f7be451104a      test   %rax,%rax
    0x7f7be451104d      jne    0x7f7be4511070
    0x7f7be4511053      mov    $0x664740,%edi
    0x7f7be4511058      movabs $0x7f7be3ed3730,%r10
    0x7f7be4511062      callq  *%r10
    0x7f7be4511065      jmpq   0x7f7be45110f0
    0x7f7be451106a      nopw   0x0(%rax,%rax,1)
    0x7f7be4511070      movslq 0x33c(%rbx),%r10
    0x7f7be4511077      cmp    $0xffffffffffffffff,%r10
    0x7f7be451107b      jne    0x7f7be45110a0
    0x7f7be4511081      mov    0x298(%rbx),%rax
    0x7f7be4511088      mov    %rax,%rdi
    0x7f7be451108b      mov    $0x456997,%esi
    0x7f7be4511090      mov    $0x40a784,%r12d
    0x7f7be4511096      callq  *%r12
    0x7f7be4511099      nopl   0x0(%rax)
    0x7f7be45110a0      cmp    $0xf,%r10
    0x7f7be45110a4      jae    0x7f7be45110d8
    0x7f7be45110aa      mov    0x298(%rbx),%rax
    0x7f7be45110b1      mov    %rax,%rdi
    0x7f7be45110b4      lea    0x0(,%r10,8),%rax
    0x7f7be45110bc      mov    $0x663780,%r11d
    0x7f7be45110c2      mov    (%rax,%r11,1),%rax
    0x7f7be45110c6      mov    %rax,%rsi
    0x7f7be45110c9      mov    $0x40a784,%r12d
    0x7f7be45110cf      callq  *%r12
    0x7f7be45110d2      nopw   0x0(%rax,%rax,1)
    0x7f7be45110d8      mov    0x298(%rbx),%rax
    0x7f7be45110df      mov    %rax,%rdi
    0x7f7be45110e2      mov    $0x4569ae,%esi
    0x7f7be45110e7      mov    $0x40a784,%r10d
    0x7f7be45110ed      callq  *%r10
    0x7f7be45110f0      mov    0x298(%rbx),%rax
    0x7f7be45110f7      rex.W jmpq *%rax
    0x7f7be45110fa      mov    0x280(%rbx),%r15
    0x7f7be4511101      xor    %r13,%r13
    0x7f7be4511104      mov    $0x7ad430,%eax
    0x7f7be4511109      mov    %r13,0x8(%rax)
    0x7f7be451110d      mov    %r13,(%rax)
    0x7f7be4511110      jmpq   0x7f7be4511178 :<stdin>:3
    0x7f7be4511115      nopl   (%rax)
    0x7f7be4511118      mov    $0x7ad430,%eax
    0x7f7be451111d      mov    (%rax),%r13
    0x7f7be4511120      mov    %r13,%rax
    0x7f7be4511123      add    $0x1,%r13
    0x7f7be4511127      jo     0x7f7be4511140 :<stdin>:4
    0x7f7be451112d      mov    $0x1,%eax
    0x7f7be4511132      mov    %eax,0x4(%rbx)
    0x7f7be4511135      mov    %r13,0x8(%rbx)
    0x7f7be4511139      jmpq   0x7f7be4511160 :<stdin>:4
    0x7f7be451113e      xchg   %ax,%ax
    0x7f7be4511140      mov    %rax,0x8(%rbx)
    0x7f7be4511144      mov    $0x1,%eax
    0x7f7be4511149      mov    %eax,0x4(%rbx)
    0x7f7be451114c      mov    %rbx,%r13
    0x7f7be451114f      mov    %r13,%rdi
    0x7f7be4511152      mov    $0x439d29,%r10d
    0x7f7be4511158      callq  *%r10
    0x7f7be451115b      nopl   0x0(%rax,%rax,1)
    0x7f7be4511160      mov    $0x7ad430,%eax
    0x7f7be4511165      mov    %rbx,%r13
    0x7f7be4511168      mov    %r13,%rdi
    0x7f7be451116b      mov    %rax,%rsi
    0x7f7be451116e      mov    $0x43952e,%r10d
    0x7f7be4511174      callq  *%r10
    0x7f7be4511177      nop
    0x7f7be4511178      mov    $0x7ad430,%eax
    0x7f7be451117d      mov    (%rax),%r13
    0x7f7be4511180      cmp    $0x989680,%r13
    0x7f7be4511187      jge    0x7f7be4511210 :<stdin>:6
    0x7f7be451118d      mov    $0x7ad430,%eax
    0x7f7be4511192      mov    0x8(%rax),%r13
    0x7f7be4511196      mov    (%rax),%r14
    0x7f7be4511199      mov    %r13,%rax
    0x7f7be451119c      add    %r14,%r13
    0x7f7be451119f      jo     0x7f7be45111b8 :<stdin>:5
    0x7f7be45111a5      mov    $0x1,%eax
    0x7f7be45111aa      mov    %eax,0x4(%rbx)
    0x7f7be45111ad      mov    %r13,0x8(%rbx)
    0x7f7be45111b1      jmpq   0x7f7be45111f0 :<stdin>:5
    0x7f7be45111b6      xchg   %ax,%ax
    0x7f7be45111b8      mov    %rax,0x8(%rbx)
    0x7f7be45111bc      mov    $0x1,%eax
    0x7f7be45111c1      mov    %eax,0x4(%rbx)
    0x7f7be45111c4      mov    %eax,0xa4(%rbx)
    0x7f7be45111ca      mov    %r14,0xa8(%rbx)
    0x7f7be45111d1      mov    %rbx,%r13
    0x7f7be45111d4      lea    0xa0(%rbx),%r14
    0x7f7be45111db      mov    %r13,%rdi
    0x7f7be45111de      mov    %r14,%rsi
    0x7f7be45111e1      mov    $0x43e54b,%r10d
    0x7f7be45111e7      callq  *%r10
    0x7f7be45111ea      nopw   0x0(%rax,%rax,1)
    0x7f7be45111f0      mov    $0x7ad430,%eax
    0x7f7be45111f5      add    $0x8,%rax
    0x7f7be45111f9      mov    %rbx,%r13
    0x7f7be45111fc      mov    %r13,%rdi
    0x7f7be45111ff      mov    %rax,%rsi
    0x7f7be4511202      mov    $0x43952e,%r10d
    0x7f7be4511208      callq  *%r10
    0x7f7be451120b      jmpq   0x7f7be4511118 :<stdin>:4
    0x7f7be4511210      mov    %r14,0xa8(%rbx)
    0x7f7be4511217      mov    0x288(%rbx),%r14
    0x7f7be451121e      lea    -0x38(%r14),%rax
    0x7f7be4511222      mov    %rax,(%r15)
    0x7f7be4511225      mov    %rax,%r14
    0x7f7be4511228      mov    %r14,0x288(%rbx)
    0x7f7be451122f      mov    0x290(%rbx),%rax
    0x7f7be4511236      cmp    %rax,%r14
    0x7f7be4511239      jae    0x7f7be4511250 :<stdin>:6
    0x7f7be451123f      movabs $0x3c3ce38820,%r10
    0x7f7be4511249      callq  *%r10
    0x7f7be451124c      nopl   0x0(%rax)
    0x7f7be4511250      mov    $0x13,%eax
    0x7f7be4511255      mov    %eax,0x8(%r14)
    0x7f7be4511259      mov    $0x10,%eax
    0x7f7be451125e      mov    %eax,0xc(%r14)
    0x7f7be4511262      mov    0xa8(%rbx),%r14
    0x7f7be4511269      mov    %rbx,%r13
    0x7f7be451126c      mov    $0x7ad0a0,%eax
    0x7f7be4511271      mov    %r13,%rdi
    0x7f7be4511274      mov    %rax,%rsi
    0x7f7be4511277      mov    $0x438f01,%r10d
    0x7f7be451127d      callq  *%r10
    0x7f7be4511280      mov    0x288(%rbx),%rax
    0x7f7be4511287      add    $0x20,%rax
    0x7f7be451128b      mov    %rbx,%r13
    0x7f7be451128e      mov    %r13,%rdi
    0x7f7be4511291      mov    %rax,%rsi
    0x7f7be4511294      mov    $0x4398c7,%r10d
    0x7f7be451129a      callq  *%r10
    0x7f7be451129d      mov    $0x7ad430,%eax
    0x7f7be45112a2      mov    (%rax),%r13
    0x7f7be45112a5      mov    0x288(%rbx),%rax
    0x7f7be45112ac      add    $0x28,%rax
    0x7f7be45112b0      mov    %r13,%rdi
    0x7f7be45112b3      mov    %rax,%rsi
    0x7f7be45112b6      mov    $0x1,%eax
    0x7f7be45112bb      mov    %eax,0x4(%rbx)
    0x7f7be45112be      mov    %r13,0x8(%rbx)
    0x7f7be45112c2      mov    $0x43d99d,%r10d
    0x7f7be45112c8      callq  *%r10
    0x7f7be45112cb      mov    0x8(%rbx),%r13
    0x7f7be45112cf      mov    $0x7ad430,%eax
    0x7f7be45112d4      mov    0x8(%rax),%r13
    0x7f7be45112d8      mov    0x288(%rbx),%rax
    0x7f7be45112df      add    $0x30,%rax
    0x7f7be45112e3      mov    %r13,%rdi
    0x7f7be45112e6      mov    %rax,%rsi
    0x7f7be45112e9      mov    $0x1,%eax
    0x7f7be45112ee      mov    %eax,0x4(%rbx)
    0x7f7be45112f1      mov    %r13,0x8(%rbx)
    0x7f7be45112f5      mov    $0x43d99d,%r10d
    0x7f7be45112fb      callq  *%r10
    0x7f7be45112fe      mov    0x8(%rbx),%r13
    0x7f7be4511302      mov    0x288(%rbx),%rax
    0x7f7be4511309      add    $0x20,%rax
    0x7f7be451130d      mov    %rax,%rdi
    0x7f7be4511310      mov    $0x2,%esi
    0x7f7be4511315      mov    $0x453a8d,%r10d
    0x7f7be451131b      callq  *%r10
    0x7f7be451131e      mov    0x288(%rbx),%rax
    0x7f7be4511325      mov    %rax,%rdi
    0x7f7be4511328      xor    %rsi,%rsi
    0x7f7be451132b      mov    $0x38,%edx
    0x7f7be4511330      movabs $0x3c3ce8ce60,%r10
    0x7f7be451133a      callq  *%r10
    0x7f7be451133d      mov    0x288(%rbx),%rax
    0x7f7be4511344      add    $0x38,%rax
    0x7f7be4511348      mov    %rax,0x288(%rbx)
    0x7f7be451134f      mov    %rbp,%rsp
    0x7f7be4511352      mov    0x28(%rsp),%rbx
    0x7f7be4511357      mov    0x20(%rsp),%r12
    0x7f7be451135c      mov    0x18(%rsp),%r13
    0x7f7be4511361      mov    0x10(%rsp),%r14
    0x7f7be4511366      mov    0x8(%rsp),%r15
    0x7f7be451136b      mov    (%rsp),%rbp
    0x7f7be451136f      add    $0x30,%rsp
    0x7f7be4511373      retq
10000000 49999995000000
0.11user 0.00system 0:00.12elapsed 92%CPU (0avgtext+0avgdata 2716maxresident)k
0inputs+0outputs (0major+750minor)pagefaults 0swaps

  Note that it is also generating a complex overhead with conditional
code to convert the result of expressions to a mpz_t object, due to not
knowing that neither 'a' or 'b' cannot overflow, neither that the
result is not used. So, if changing the 'a' and 'b' to int32_t, it
can run significantly faster due to knowing neither operation result
may become a mpz_t, but the result of 'b' will overflow:

int32_t a, b;
for (a = b = 0; a < 10000000; ++a)
    b += a;
print("%d %d\n", a, b);
    0x7f2e9a538000      sub    $0x30,%rsp
    0x7f2e9a538004      mov    %rbx,0x28(%rsp)
    0x7f2e9a538009      mov    %r12,0x20(%rsp)
    0x7f2e9a53800e      mov    %r13,0x18(%rsp)
    0x7f2e9a538013      mov    %r14,0x10(%rsp)
    0x7f2e9a538018      mov    %r15,0x8(%rsp)
    0x7f2e9a53801d      mov    %rbp,(%rsp)
    0x7f2e9a538021      mov    %rsp,%rbp
    0x7f2e9a538024      sub    $0x38,%rsp
    0x7f2e9a538028      mov    %rdi,%rbx
    0x7f2e9a53802b      lea    0x340(%rbx),%rax
    0x7f2e9a538032      mov    %rax,%rdi
    0x7f2e9a538035      mov    $0x1,%esi
    0x7f2e9a53803a      movabs $0x3c3ce37000,%r10
    0x7f2e9a538044      callq  *%r10
    0x7f2e9a538047      movslq %eax,%rax
    0x7f2e9a53804a      test   %rax,%rax
    0x7f2e9a53804d      jne    0x7f2e9a538070
    0x7f2e9a538053      mov    $0x664740,%edi
    0x7f2e9a538058      movabs $0x7f2e99efa730,%r10
    0x7f2e9a538062      callq  *%r10
    0x7f2e9a538065      jmpq   0x7f2e9a5380f0
    0x7f2e9a53806a      nopw   0x0(%rax,%rax,1)
    0x7f2e9a538070      movslq 0x33c(%rbx),%r10
    0x7f2e9a538077      cmp    $0xffffffffffffffff,%r10
    0x7f2e9a53807b      jne    0x7f2e9a5380a0
    0x7f2e9a538081      mov    0x298(%rbx),%rax
    0x7f2e9a538088      mov    %rax,%rdi
    0x7f2e9a53808b      mov    $0x456997,%esi
    0x7f2e9a538090      mov    $0x40a784,%r12d
    0x7f2e9a538096      callq  *%r12
    0x7f2e9a538099      nopl   0x0(%rax)
    0x7f2e9a5380a0      cmp    $0xf,%r10
    0x7f2e9a5380a4      jae    0x7f2e9a5380d8
    0x7f2e9a5380aa      mov    0x298(%rbx),%rax
    0x7f2e9a5380b1      mov    %rax,%rdi
    0x7f2e9a5380b4      lea    0x0(,%r10,8),%rax
    0x7f2e9a5380bc      mov    $0x663780,%r11d
    0x7f2e9a5380c2      mov    (%rax,%r11,1),%rax
    0x7f2e9a5380c6      mov    %rax,%rsi
    0x7f2e9a5380c9      mov    $0x40a784,%r12d
    0x7f2e9a5380cf      callq  *%r12
    0x7f2e9a5380d2      nopw   0x0(%rax,%rax,1)
    0x7f2e9a5380d8      mov    0x298(%rbx),%rax
    0x7f2e9a5380df      mov    %rax,%rdi
    0x7f2e9a5380e2      mov    $0x4569ae,%esi
    0x7f2e9a5380e7      mov    $0x40a784,%r10d
    0x7f2e9a5380ed      callq  *%r10
    0x7f2e9a5380f0      mov    0x298(%rbx),%rax
    0x7f2e9a5380f7      rex.W jmpq *%rax
    0x7f2e9a5380fa      mov    0x280(%rbx),%r15
    0x7f2e9a538101      xor    %r13,%r13
    0x7f2e9a538104      mov    $0xa61430,%eax
    0x7f2e9a538109      mov    %r13d,0x4(%rax)
    0x7f2e9a53810d      mov    %r13d,(%rax)
    0x7f2e9a538110      jmpq   0x7f2e9a538128 :<stdin>:3
    0x7f2e9a538115      nopl   (%rax)
    0x7f2e9a538118      mov    $0xa61430,%eax
    0x7f2e9a53811d      movslq (%rax),%r13
    0x7f2e9a538120      add    $0x1,%r13
    0x7f2e9a538124      mov    %r13d,(%rax)
    0x7f2e9a538127      nop
    0x7f2e9a538128      mov    $0xa61430,%eax
    0x7f2e9a53812d      movslq (%rax),%r13
    0x7f2e9a538130      cmp    $0x989680,%r13
    0x7f2e9a538137      jge    0x7f2e9a538158 :<stdin>:6
    0x7f2e9a53813d      mov    $0xa61430,%eax
    0x7f2e9a538142      movslq 0x4(%rax),%r13
    0x7f2e9a538146      movslq (%rax),%r14
    0x7f2e9a538149      add    %r14,%r13
    0x7f2e9a53814c      mov    %r13d,0x4(%rax)
    0x7f2e9a538150      jmpq   0x7f2e9a538118 :<stdin>:4
    0x7f2e9a538155      nopl   (%rax)
    0x7f2e9a538158      mov    %r14,0xa8(%rbx)
    0x7f2e9a53815f      mov    0x288(%rbx),%r14
    0x7f2e9a538166      lea    -0x38(%r14),%rax
    0x7f2e9a53816a      mov    %rax,(%r15)
    0x7f2e9a53816d      mov    %rax,%r14
    0x7f2e9a538170      mov    %r14,0x288(%rbx)
    0x7f2e9a538177      mov    0x290(%rbx),%rax
    0x7f2e9a53817e      cmp    %rax,%r14
    0x7f2e9a538181      jae    0x7f2e9a538198 :<stdin>:6
    0x7f2e9a538187      movabs $0x3c3ce38820,%r10
    0x7f2e9a538191      callq  *%r10
    0x7f2e9a538194      nopl   0x0(%rax)
    0x7f2e9a538198      mov    $0x13,%eax
    0x7f2e9a53819d      mov    %eax,0x8(%r14)
    0x7f2e9a5381a1      mov    $0x10,%eax
    0x7f2e9a5381a6      mov    %eax,0xc(%r14)
    0x7f2e9a5381aa      mov    0xa8(%rbx),%r14
    0x7f2e9a5381b1      mov    %rbx,%r13
    0x7f2e9a5381b4      mov    $0xa610a0,%eax
    0x7f2e9a5381b9      mov    %r13,%rdi
    0x7f2e9a5381bc      mov    %rax,%rsi
    0x7f2e9a5381bf      mov    $0x438f01,%r10d
    0x7f2e9a5381c5      callq  *%r10
    0x7f2e9a5381c8      mov    0x288(%rbx),%rax
    0x7f2e9a5381cf      add    $0x20,%rax
    0x7f2e9a5381d3      mov    %rbx,%r13
    0x7f2e9a5381d6      mov    %r13,%rdi
    0x7f2e9a5381d9      mov    %rax,%rsi
    0x7f2e9a5381dc      mov    $0x4398c7,%r10d
    0x7f2e9a5381e2      callq  *%r10
    0x7f2e9a5381e5      mov    $0xa61430,%eax
    0x7f2e9a5381ea      movslq (%rax),%r13
    0x7f2e9a5381ed      mov    0x288(%rbx),%rax
    0x7f2e9a5381f4      add    $0x28,%rax
    0x7f2e9a5381f8      mov    %r13,%rdi
    0x7f2e9a5381fb      mov    %rax,%rsi
    0x7f2e9a5381fe      mov    $0x1,%eax
    0x7f2e9a538203      mov    %eax,0x4(%rbx)
    0x7f2e9a538206      mov    %r13,0x8(%rbx)
    0x7f2e9a53820a      mov    $0x43d99d,%r10d
    0x7f2e9a538210      callq  *%r10
    0x7f2e9a538213      mov    0x8(%rbx),%r13
    0x7f2e9a538217      mov    $0xa61430,%eax
    0x7f2e9a53821c      movslq 0x4(%rax),%r13
    0x7f2e9a538220      mov    0x288(%rbx),%rax
    0x7f2e9a538227      add    $0x30,%rax
    0x7f2e9a53822b      mov    %r13,%rdi
    0x7f2e9a53822e      mov    %rax,%rsi
    0x7f2e9a538231      mov    $0x1,%eax
    0x7f2e9a538236      mov    %eax,0x4(%rbx)
    0x7f2e9a538239      mov    %r13,0x8(%rbx)
    0x7f2e9a53823d      mov    $0x43d99d,%r10d
    0x7f2e9a538243      callq  *%r10
    0x7f2e9a538246      mov    0x8(%rbx),%r13
    0x7f2e9a53824a      mov    0x288(%rbx),%rax
    0x7f2e9a538251      add    $0x20,%rax
    0x7f2e9a538255      mov    %rax,%rdi
    0x7f2e9a538258      mov    $0x2,%esi
    0x7f2e9a53825d      mov    $0x453a8d,%r10d
    0x7f2e9a538263      callq  *%r10
    0x7f2e9a538266      mov    0x288(%rbx),%rax
    0x7f2e9a53826d      mov    %rax,%rdi
    0x7f2e9a538270      xor    %rsi,%rsi
    0x7f2e9a538273      mov    $0x38,%edx
    0x7f2e9a538278      movabs $0x3c3ce8ce60,%r10
    0x7f2e9a538282      callq  *%r10
    0x7f2e9a538285      mov    0x288(%rbx),%rax
    0x7f2e9a53828c      add    $0x38,%rax
    0x7f2e9a538290      mov    %rax,0x288(%rbx)
    0x7f2e9a538297      mov    %rbp,%rsp
    0x7f2e9a53829a      mov    0x28(%rsp),%rbx
    0x7f2e9a53829f      mov    0x20(%rsp),%r12
    0x7f2e9a5382a4      mov    0x18(%rsp),%r13
    0x7f2e9a5382a9      mov    0x10(%rsp),%r14
    0x7f2e9a5382ae      mov    0x8(%rsp),%r15
    0x7f2e9a5382b3      mov    (%rsp),%rbp
    0x7f2e9a5382b7      add    $0x30,%rsp
    0x7f2e9a5382bb      retq
10000000 -2014260032
0.02user 0.01system 0:00.04elapsed 86%CPU (0avgtext+0avgdata 2708maxresident)k
0inputs+0outputs (0major+749minor)pagefaults 0swaps

Making it fully dynamically typed, that is, all operations are executed
in a fallback C function that checks object types for every operation:

$ /usr/bin/time ./owl -v < t

auto a, b;
for (a = b = 0; a < 10000000; ++a)
    b += a;
print("%d %d\n", a, b);
    0x7f2587579000      sub    $0x30,%rsp
    0x7f2587579004      mov    %rbx,0x28(%rsp)
    0x7f2587579009      mov    %r12,0x20(%rsp)
    0x7f258757900e      mov    %r13,0x18(%rsp)
    0x7f2587579013      mov    %r14,0x10(%rsp)
    0x7f2587579018      mov    %r15,0x8(%rsp)
    0x7f258757901d      mov    %rbp,(%rsp)
    0x7f2587579021      mov    %rsp,%rbp
    0x7f2587579024      sub    $0x48,%rsp
    0x7f2587579028      mov    %rdi,%rbx
    0x7f258757902b      lea    0x340(%rbx),%rax
    0x7f2587579032      mov    %rax,%rdi
    0x7f2587579035      mov    $0x1,%esi
    0x7f258757903a      movabs $0x3c3ce37000,%r10
    0x7f2587579044      callq  *%r10
    0x7f2587579047      movslq %eax,%rax
    0x7f258757904a      test   %rax,%rax
    0x7f258757904d      jne    0x7f2587579070
    0x7f2587579053      mov    $0x664740,%edi
    0x7f2587579058      movabs $0x7f2586f3b730,%r10
    0x7f2587579062      callq  *%r10
    0x7f2587579065      jmpq   0x7f25875790f0
    0x7f258757906a      nopw   0x0(%rax,%rax,1)
    0x7f2587579070      movslq 0x33c(%rbx),%r10
    0x7f2587579077      cmp    $0xffffffffffffffff,%r10
    0x7f258757907b      jne    0x7f25875790a0
    0x7f2587579081      mov    0x298(%rbx),%rax
    0x7f2587579088      mov    %rax,%rdi
    0x7f258757908b      mov    $0x456997,%esi
    0x7f2587579090      mov    $0x40a784,%r12d
    0x7f2587579096      callq  *%r12
    0x7f2587579099      nopl   0x0(%rax)
    0x7f25875790a0      cmp    $0xf,%r10
    0x7f25875790a4      jae    0x7f25875790d8
    0x7f25875790aa      mov    0x298(%rbx),%rax
    0x7f25875790b1      mov    %rax,%rdi
    0x7f25875790b4      lea    0x0(,%r10,8),%rax
    0x7f25875790bc      mov    $0x663780,%r11d
    0x7f25875790c2      mov    (%rax,%r11,1),%rax
    0x7f25875790c6      mov    %rax,%rsi
    0x7f25875790c9      mov    $0x40a784,%r12d
    0x7f25875790cf      callq  *%r12
    0x7f25875790d2      nopw   0x0(%rax,%rax,1)
    0x7f25875790d8      mov    0x298(%rbx),%rax
    0x7f25875790df      mov    %rax,%rdi
    0x7f25875790e2      mov    $0x4569ae,%esi
    0x7f25875790e7      mov    $0x40a784,%r10d
    0x7f25875790ed      callq  *%r10
    0x7f25875790f0      mov    0x298(%rbx),%rax
    0x7f25875790f7      rex.W jmpq *%rax
    0x7f25875790fa      mov    0x280(%rbx),%r15
    0x7f2587579101      xor    %r13,%r13
    0x7f2587579104      mov    $0x148f460,%eax
    0x7f2587579109      add    $0x8,%rax
    0x7f258757910d      mov    %r13,%rdi
    0x7f2587579110      mov    %rax,%rsi
    0x7f2587579113      mov    $0x1,%eax
    0x7f2587579118      mov    %eax,0x4(%rbx)
    0x7f258757911b      mov    %r13,0x8(%rbx)
    0x7f258757911f      mov    %r10,-0x38(%rbp)
    0x7f2587579123      mov    $0x43d99d,%r10d
    0x7f2587579129      callq  *%r10
    0x7f258757912c      mov    -0x38(%rbp),%r10
    0x7f2587579130      mov    0x8(%rbx),%r13
    0x7f2587579134      mov    $0x148f460,%eax
    0x7f2587579139      mov    %r13,%rdi
    0x7f258757913c      mov    %rax,%rsi
    0x7f258757913f      mov    $0x1,%eax
    0x7f2587579144      mov    %eax,0x4(%rbx)
    0x7f2587579147      mov    %r13,0x8(%rbx)
    0x7f258757914b      mov    $0x43d99d,%r10d
    0x7f2587579151      callq  *%r10
    0x7f2587579154      mov    0x8(%rbx),%r13
    0x7f2587579158      jmpq   0x7f25875791a0 :<stdin>:3
    0x7f258757915d      nopl   (%rax)
    0x7f2587579160      mov    $0x148f460,%eax
    0x7f2587579165      mov    %rbx,%r13
    0x7f2587579168      mov    %r13,%rdi
    0x7f258757916b      mov    %rax,%rsi
    0x7f258757916e      mov    $0x439074,%r10d
    0x7f2587579174      callq  *%r10
    0x7f2587579177      mov    %rbx,%r13
    0x7f258757917a      mov    %r13,%rdi
    0x7f258757917d      mov    $0x439d29,%r10d
    0x7f2587579183      callq  *%r10
    0x7f2587579186      mov    $0x148f460,%eax
    0x7f258757918b      mov    %rbx,%r13
    0x7f258757918e      mov    %r13,%rdi
    0x7f2587579191      mov    %rax,%rsi
    0x7f2587579194      mov    $0x4398c7,%r10d
    0x7f258757919a      callq  *%r10
    0x7f258757919d      nopl   (%rax)
    0x7f25875791a0      mov    $0x148f460,%eax
    0x7f25875791a5      mov    %rbx,%r13
    0x7f25875791a8      mov    %r13,%rdi
    0x7f25875791ab      mov    %rax,%rsi
    0x7f25875791ae      mov    $0x439074,%r10d
    0x7f25875791b4      callq  *%r10
    0x7f25875791b7      mov    $0x989680,%r14d
    0x7f25875791bd      mov    $0x1,%eax
    0x7f25875791c2      mov    %eax,0xa4(%rbx)
    0x7f25875791c8      mov    %r14,0xa8(%rbx)
    0x7f25875791cf      mov    %rbx,%r13
    0x7f25875791d2      lea    0xa0(%rbx),%r14
    0x7f25875791d9      mov    %r13,%rdi
    0x7f25875791dc      mov    %r14,%rsi
    0x7f25875791df      mov    $0x43a1f4,%r10d
    0x7f25875791e5      callq  *%r10
    0x7f25875791e8      mov    0x8(%rbx),%r13
    0x7f25875791ec      test   %r13,%r13
    0x7f25875791ef      je     0x7f2587579268 :<stdin>:6
    0x7f25875791f5      mov    $0x148f460,%eax
    0x7f25875791fa      add    $0x8,%rax
    0x7f25875791fe      mov    %rbx,%r13
    0x7f2587579201      mov    %r13,%rdi
    0x7f2587579204      mov    %rax,%rsi
    0x7f2587579207      mov    $0x439074,%r10d
    0x7f258757920d      callq  *%r10
    0x7f2587579210      mov    $0x148f460,%eax
    0x7f2587579215      lea    0xa0(%rbx),%r14
    0x7f258757921c      mov    %r14,%rdi
    0x7f258757921f      mov    %rax,%rsi
    0x7f2587579222      mov    $0x439074,%r10d
    0x7f2587579228      callq  *%r10
    0x7f258757922b      mov    %rbx,%r13
    0x7f258757922e      lea    0xa0(%rbx),%r14
    0x7f2587579235      mov    %r13,%rdi
    0x7f2587579238      mov    %r14,%rsi
    0x7f258757923b      mov    $0x43bb7c,%r10d
    0x7f2587579241      callq  *%r10
    0x7f2587579244      mov    $0x148f460,%eax
    0x7f2587579249      add    $0x8,%rax
    0x7f258757924d      mov    %rbx,%r13
    0x7f2587579250      mov    %r13,%rdi
    0x7f2587579253      mov    %rax,%rsi
    0x7f2587579256      mov    $0x4398c7,%r10d
    0x7f258757925c      callq  *%r10
    0x7f258757925f      jmpq   0x7f2587579160 :<stdin>:4
    0x7f2587579264      nopl   0x0(%rax)
    0x7f2587579268      mov    %r14,0xa8(%rbx)
    0x7f258757926f      mov    0x288(%rbx),%r14
    0x7f2587579276      lea    -0x38(%r14),%rax
    0x7f258757927a      mov    %rax,(%r15)
    0x7f258757927d      mov    %rax,%r14
    0x7f2587579280      mov    %r14,0x288(%rbx)
    0x7f2587579287      mov    0x290(%rbx),%rax
    0x7f258757928e      cmp    %rax,%r14
    0x7f2587579291      jae    0x7f25875792a8 :<stdin>:6
    0x7f2587579297      movabs $0x3c3ce38820,%r10
    0x7f25875792a1      callq  *%r10
    0x7f25875792a4      nopl   0x0(%rax)
    0x7f25875792a8      mov    $0x13,%eax
    0x7f25875792ad      mov    %eax,0x8(%r14)
    0x7f25875792b1      mov    $0x10,%eax
    0x7f25875792b6      mov    %eax,0xc(%r14)
    0x7f25875792ba      mov    0xa8(%rbx),%r14
    0x7f25875792c1      mov    %rbx,%r13
    0x7f25875792c4      mov    $0x148f110,%eax
    0x7f25875792c9      mov    %r13,%rdi
    0x7f25875792cc      mov    %rax,%rsi
    0x7f25875792cf      mov    $0x438f01,%r10d
    0x7f25875792d5      callq  *%r10
    0x7f25875792d8      mov    0x288(%rbx),%rax
    0x7f25875792df      add    $0x20,%rax
    0x7f25875792e3      mov    %rbx,%r13
    0x7f25875792e6      mov    %r13,%rdi
    0x7f25875792e9      mov    %rax,%rsi
    0x7f25875792ec      mov    $0x4398c7,%r10d
    0x7f25875792f2      callq  *%r10
    0x7f25875792f5      mov    $0x148f460,%eax
    0x7f25875792fa      mov    %rbx,%r13
    0x7f25875792fd      mov    %r13,%rdi
    0x7f2587579300      mov    %rax,%rsi
    0x7f2587579303      mov    $0x439074,%r10d
    0x7f2587579309      callq  *%r10
    0x7f258757930c      mov    0x288(%rbx),%rax
    0x7f2587579313      add    $0x28,%rax
    0x7f2587579317      mov    %rbx,%r13
    0x7f258757931a      mov    %r13,%rdi
    0x7f258757931d      mov    %rax,%rsi
    0x7f2587579320      mov    $0x4398c7,%r10d
    0x7f2587579326      callq  *%r10
    0x7f2587579329      mov    $0x148f460,%eax
    0x7f258757932e      add    $0x8,%rax
    0x7f2587579332      mov    %rbx,%r13
    0x7f2587579335      mov    %r13,%rdi
    0x7f2587579338      mov    %rax,%rsi
    0x7f258757933b      mov    $0x439074,%r10d
    0x7f2587579341      callq  *%r10
    0x7f2587579344      mov    0x288(%rbx),%rax
    0x7f258757934b      add    $0x30,%rax
    0x7f258757934f      mov    %rbx,%r13
    0x7f2587579352      mov    %r13,%rdi
    0x7f2587579355      mov    %rax,%rsi
    0x7f2587579358      mov    $0x4398c7,%r10d
    0x7f258757935e      callq  *%r10
    0x7f2587579361      mov    0x288(%rbx),%rax
    0x7f2587579368      add    $0x20,%rax
    0x7f258757936c      mov    %rax,%rdi
    0x7f258757936f      mov    $0x2,%esi
    0x7f2587579374      mov    $0x453a8d,%r10d
    0x7f258757937a      callq  *%r10
    0x7f258757937d      mov    0x288(%rbx),%rax
    0x7f2587579384      mov    %rax,%rdi
    0x7f2587579387      xor    %rsi,%rsi
    0x7f258757938a      mov    $0x38,%edx
    0x7f258757938f      movabs $0x3c3ce8ce60,%r10
    0x7f2587579399      callq  *%r10
    0x7f258757939c      mov    0x288(%rbx),%rax
    0x7f25875793a3      add    $0x38,%rax
    0x7f25875793a7      mov    %rax,0x288(%rbx)
    0x7f25875793ae      mov    %rbp,%rsp
    0x7f25875793b1      mov    0x28(%rsp),%rbx
    0x7f25875793b6      mov    0x20(%rsp),%r12
    0x7f25875793bb      mov    0x18(%rsp),%r13
    0x7f25875793c0      mov    0x10(%rsp),%r14
    0x7f25875793c5      mov    0x8(%rsp),%r15
    0x7f25875793ca      mov    (%rsp),%rbp
    0x7f25875793ce      add    $0x30,%rsp
    0x7f25875793d2      retq
10000000 49999995000000
0.64user 0.01system 0:00.67elapsed 97%CPU (0avgtext+0avgdata 2732maxresident)k
0inputs+0outputs (0major+754minor)pagefaults 0swaps

A final example is using float64_t as base type. Note that the
language allows '++' for float (or any other) types, and just
understands it as 'value += 1':

$ /usr/bin/time ./owl -v < t

float64_t a, b;
for (a = b = 0; a < 10000000; ++a)
    b += a;
print("%d %d\n", a, b);
    0x7f667e97a000      sub    $0x30,%rsp
    0x7f667e97a004      mov    %rbx,0x28(%rsp)
    0x7f667e97a009      mov    %r12,0x20(%rsp)
    0x7f667e97a00e      mov    %r13,0x18(%rsp)
    0x7f667e97a013      mov    %r14,0x10(%rsp)
    0x7f667e97a018      mov    %r15,0x8(%rsp)
    0x7f667e97a01d      mov    %rbp,(%rsp)
    0x7f667e97a021      mov    %rsp,%rbp
    0x7f667e97a024      sub    $0x38,%rsp
    0x7f667e97a028      mov    %rdi,%rbx
    0x7f667e97a02b      lea    0x340(%rbx),%rax
    0x7f667e97a032      mov    %rax,%rdi
    0x7f667e97a035      mov    $0x1,%esi
    0x7f667e97a03a      movabs $0x3c3ce37000,%r10
    0x7f667e97a044      callq  *%r10
    0x7f667e97a047      movslq %eax,%rax
    0x7f667e97a04a      test   %rax,%rax
    0x7f667e97a04d      jne    0x7f667e97a070
    0x7f667e97a053      mov    $0x664740,%edi
    0x7f667e97a058      movabs $0x7f667e33c730,%r10
    0x7f667e97a062      callq  *%r10
    0x7f667e97a065      jmpq   0x7f667e97a0f0
    0x7f667e97a06a      nopw   0x0(%rax,%rax,1)
    0x7f667e97a070      movslq 0x33c(%rbx),%r10
    0x7f667e97a077      cmp    $0xffffffffffffffff,%r10
    0x7f667e97a07b      jne    0x7f667e97a0a0
    0x7f667e97a081      mov    0x298(%rbx),%rax
    0x7f667e97a088      mov    %rax,%rdi
    0x7f667e97a08b      mov    $0x456997,%esi
    0x7f667e97a090      mov    $0x40a784,%r12d
    0x7f667e97a096      callq  *%r12
    0x7f667e97a099      nopl   0x0(%rax)
    0x7f667e97a0a0      cmp    $0xf,%r10
    0x7f667e97a0a4      jae    0x7f667e97a0d8
    0x7f667e97a0aa      mov    0x298(%rbx),%rax
    0x7f667e97a0b1      mov    %rax,%rdi
    0x7f667e97a0b4      lea    0x0(,%r10,8),%rax
    0x7f667e97a0bc      mov    $0x663780,%r11d
    0x7f667e97a0c2      mov    (%rax,%r11,1),%rax
    0x7f667e97a0c6      mov    %rax,%rsi
    0x7f667e97a0c9      mov    $0x40a784,%r12d
    0x7f667e97a0cf      callq  *%r12
    0x7f667e97a0d2      nopw   0x0(%rax,%rax,1)
    0x7f667e97a0d8      mov    0x298(%rbx),%rax
    0x7f667e97a0df      mov    %rax,%rdi
    0x7f667e97a0e2      mov    $0x4569ae,%esi
    0x7f667e97a0e7      mov    $0x40a784,%r10d
    0x7f667e97a0ed      callq  *%r10
    0x7f667e97a0f0      mov    0x298(%rbx),%rax
    0x7f667e97a0f7      rex.W jmpq *%rax
    0x7f667e97a0fa      mov    0x280(%rbx),%r15
    0x7f667e97a101      xor    %r13,%r13
    0x7f667e97a104      mov    $0x23e0430,%eax
    0x7f667e97a109      cvtsi2sd %r13,%xmm8
    0x7f667e97a10e      movsd  %xmm8,0x8(%rax)
    0x7f667e97a114      cvtsi2sd %r13,%xmm8
    0x7f667e97a119      movsd  %xmm8,(%rax)
    0x7f667e97a11e      jmpq   0x7f667e97a150 :<stdin>:3
    0x7f667e97a123      nopl   0x0(%rax,%rax,1)
    0x7f667e97a128      mov    $0x23e0430,%eax
    0x7f667e97a12d      movsd  (%rax),%xmm8
    0x7f667e97a132      movabs $0x3ff0000000000000,%r10
    0x7f667e97a13c      movq   %r10,%xmm9
    0x7f667e97a141      addsd  %xmm9,%xmm8
    0x7f667e97a146      movsd  %xmm8,(%rax)
    0x7f667e97a14b      nopl   0x0(%rax,%rax,1)
    0x7f667e97a150      mov    $0x23e0430,%eax
    0x7f667e97a155      movsd  (%rax),%xmm8
    0x7f667e97a15a      mov    $0x989680,%r14d
    0x7f667e97a160      cvtsi2sd %r14,%xmm9
    0x7f667e97a165      ucomisd %xmm9,%xmm8
    0x7f667e97a16a      jae    0x7f667e97a190 :<stdin>:6
    0x7f667e97a170      mov    $0x23e0430,%eax
    0x7f667e97a175      movsd  0x8(%rax),%xmm8
    0x7f667e97a17b      movsd  (%rax),%xmm9
    0x7f667e97a180      addsd  %xmm9,%xmm8
    0x7f667e97a185      movsd  %xmm8,0x8(%rax)
    0x7f667e97a18b      jmpq   0x7f667e97a128 :<stdin>:4
    0x7f667e97a190      mov    %r14,0xa8(%rbx)
    0x7f667e97a197      mov    0x288(%rbx),%r14
    0x7f667e97a19e      lea    -0x38(%r14),%rax
    0x7f667e97a1a2      mov    %rax,(%r15)
    0x7f667e97a1a5      mov    %rax,%r14
    0x7f667e97a1a8      mov    %r14,0x288(%rbx)
    0x7f667e97a1af      mov    0x290(%rbx),%rax
    0x7f667e97a1b6      cmp    %rax,%r14
    0x7f667e97a1b9      jae    0x7f667e97a1d0 :<stdin>:6
    0x7f667e97a1bf      movabs $0x3c3ce38820,%r10
    0x7f667e97a1c9      callq  *%r10
    0x7f667e97a1cc      nopl   0x0(%rax)
    0x7f667e97a1d0      mov    $0x13,%eax
    0x7f667e97a1d5      mov    %eax,0x8(%r14)
    0x7f667e97a1d9      mov    $0x10,%eax
    0x7f667e97a1de      mov    %eax,0xc(%r14)
    0x7f667e97a1e2      mov    0xa8(%rbx),%r14
    0x7f667e97a1e9      mov    %rbx,%r13
    0x7f667e97a1ec      mov    $0x23e00a0,%eax
    0x7f667e97a1f1      mov    %r13,%rdi
    0x7f667e97a1f4      mov    %rax,%rsi
    0x7f667e97a1f7      mov    $0x438f01,%r10d
    0x7f667e97a1fd      callq  *%r10
    0x7f667e97a200      mov    0x288(%rbx),%rax
    0x7f667e97a207      add    $0x20,%rax
    0x7f667e97a20b      mov    %rbx,%r13
    0x7f667e97a20e      mov    %r13,%rdi
    0x7f667e97a211      mov    %rax,%rsi
    0x7f667e97a214      mov    $0x4398c7,%r10d
    0x7f667e97a21a      callq  *%r10
    0x7f667e97a21d      mov    $0x23e0430,%eax
    0x7f667e97a222      movsd  (%rax),%xmm8
    0x7f667e97a227      mov    0x288(%rbx),%rax
    0x7f667e97a22e      add    $0x28,%rax
    0x7f667e97a232      movsd  %xmm8,%xmm0
    0x7f667e97a237      mov    %rax,%rdi
    0x7f667e97a23a      mov    $0x2,%eax
    0x7f667e97a23f      mov    %eax,0x4(%rbx)
    0x7f667e97a242      movsd  %xmm8,0x8(%rbx)
    0x7f667e97a248      mov    $0x4406ac,%r10d
    0x7f667e97a24e      callq  *%r10
    0x7f667e97a251      movsd  0x8(%rbx),%xmm8
    0x7f667e97a257      mov    $0x23e0430,%eax
    0x7f667e97a25c      movsd  0x8(%rax),%xmm8
    0x7f667e97a262      mov    0x288(%rbx),%rax
    0x7f667e97a269      add    $0x30,%rax
    0x7f667e97a26d      movsd  %xmm8,%xmm0
    0x7f667e97a272      mov    %rax,%rdi
    0x7f667e97a275      mov    $0x2,%eax
    0x7f667e97a27a      mov    %eax,0x4(%rbx)
    0x7f667e97a27d      movsd  %xmm8,0x8(%rbx)
    0x7f667e97a283      mov    $0x4406ac,%r10d
    0x7f667e97a289      callq  *%r10
    0x7f667e97a28c      movsd  0x8(%rbx),%xmm8
    0x7f667e97a292      mov    0x288(%rbx),%rax
    0x7f667e97a299      add    $0x20,%rax
    0x7f667e97a29d      mov    %rax,%rdi
    0x7f667e97a2a0      mov    $0x2,%esi
    0x7f667e97a2a5      mov    $0x453a8d,%r10d
    0x7f667e97a2ab      callq  *%r10
    0x7f667e97a2ae      mov    0x288(%rbx),%rax
    0x7f667e97a2b5      mov    %rax,%rdi
    0x7f667e97a2b8      xor    %rsi,%rsi
    0x7f667e97a2bb      mov    $0x38,%edx
    0x7f667e97a2c0      movabs $0x3c3ce8ce60,%r10
    0x7f667e97a2ca      callq  *%r10
    0x7f667e97a2cd      mov    0x288(%rbx),%rax
    0x7f667e97a2d4      add    $0x38,%rax
    0x7f667e97a2d8      mov    %rax,0x288(%rbx)
    0x7f667e97a2df      mov    %rbp,%rsp
    0x7f667e97a2e2      mov    0x28(%rsp),%rbx
    0x7f667e97a2e7      mov    0x20(%rsp),%r12
    0x7f667e97a2ec      mov    0x18(%rsp),%r13
    0x7f667e97a2f1      mov    0x10(%rsp),%r14
    0x7f667e97a2f6      mov    0x8(%rsp),%r15
    0x7f667e97a2fb      mov    (%rsp),%rbp
    0x7f667e97a2ff      add    $0x30,%rsp
    0x7f667e97a303      retq
10000000.0 49999995000000.0
0.04user 0.00system 0:00.10elapsed 49%CPU (0avgtext+0avgdata 2832maxresident)k
128inputs+0outputs (1major+778minor)pagefaults 0swaps